TransWikia.com

Запуск нескольких активностей при быстром нажатии кнопки

Stack Overflow на русском Asked on November 10, 2021

Заметил, что в приложении, в котором есть listview и вторая активность при простом нажатии на элемент listview все хорошо переходит на вторую активность, но вот, если начать быстро "тыкать" на элемент listview откроется как минимум две активности. Открывается одна и тут же она же открывается еще раз. И вот, если надо возвратиться назад к listview приходиться на кнопку назад тоже нажимать как минимум два раза. Хотелось бы спросить за счет чего это происходит и как можно было бы это исправить?

One Answer

Вы можете реализовать Debouncer который не позволяет слишком часто нажимать на кнопку. Например не чаще чем раз в секунду.

Можно написать что-то вроде такого:

import android.os.SystemClock;
import android.view.View;
import java.util.Map;
import java.util.WeakHashMap;

/**
* A Debounced OnClickListener 
* Rejects clicks that are too close together in time.
* This class is safe to use as an OnClickListener for multiple views, and will debounce each one separately.
*/ 
public abstract class DebouncedOnClickListener implements View.OnClickListener { 

    private final long minimumIntervalMillis; 
    private Map<View, Long> lastClickMap; 

    /**
    * Implement this in your subclass instead of onClick 
    * @param v The view that was clicked 
    */
    public abstract void onDebouncedClick(View v);

    /** 
    * The one and only constructor 
    * @param minimumIntervalMillis The minimum allowed time between clicks - any click sooner than this after a previous click will be rejected
    */ 
    public DebouncedOnClickListener(long minimumIntervalMillis) {
        this.minimumIntervalMillis = minimumIntervalMillis; 
        this.lastClickMap = new WeakHashMap<>();
    } 

    @Override
    public void onClick(View clickedView) { 
        Long previousClickTimestamp = lastClickMap.get(clickedView); 
        long currentTimestamp = SystemClock.uptimeMillis();
        lastClickMap.put(clickedView, currentTimestamp);
        
        if(previousClickTimestamp == null || Math.abs(currentTimestamp - previousClickTimestamp) > minimumIntervalMillis) { 
            onDebouncedClick(clickedView); 
        } 
    }
}

Если вы используете RX Java, то там уже есть встроенные решения. Ну или вы можете поискать другие реализации дебаунсеров.

Answered by Sergei Buvaka on November 10, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP