Получите активность onDestroy () в адаптере Recycler - PullRequest
0 голосов
/ 15 октября 2019

Я использую обработчик для отображения таймера в элементе списка RecyclerView. Когда я нажимаю обратно Activity, на котором находится RecyclerView, полностью уничтожается, Handler() все еще работает в фоновом режиме. Обработчик создается и инициируется в ViewHolder. Есть ли способ удалить обратные вызовы из обработчика из самого ViewHolder?

Пример кода My ViewHolder

class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), CustomRunnable.CustomRunnableListener{

    private val handler = Handler()
    lateinit var customRunnable: CustomRunnable //custom runnable for my timer logic

    fun bind(position: Int, listModelClass: ModelClass?){


        if(someCondition){
                customRunnable = CustomRunnable(handler, this, textView, listModelClass)
                handler.postDelayed(customRunnable, 1000)
        }

    }

    override fun onTimerFinish(listModelClass: ModelClass) {
            // I get this call back when the timer finishes
            handler.removeCallbacks(customRunnable)
    }

}

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Вы можете сделать это onDestory () активности

handler.removeCallbacksAndMessages(null);

Удалить все ожидающие сообщения обратных вызовов и отправленных сообщений, чей объект является токеном. Если токен нулевой, все обратные вызовы и сообщения будут удалены.

0 голосов
/ 15 октября 2019

Насколько мне известно, на адаптере нет метода, который вызывается, когда RecyclerView отсоединен от действия.

Попробуйте создать объект таймера или список объектов в ваших BaseActivity или * 1005. * Класс и после нажатия onBack запустить метод, который остановит этот таймер или таймеры.

//Declare timer
    CountDownTimer cTimer = null;

    //start timer function
    void startTimer() {
        cTimer = new CountDownTimer(30000, 1000) {
            public void onTick(long millisUntilFinished) {
            }
            public void onFinish() {
            }
        };
        cTimer.start();
    }


    //cancel timer
    void cancelTimer() {
        if(cTimer!=null)
            cTimer.cancel();
    }
...