Eu tenho um manipulador da minha sub-atividade que foi chamado pela atividade principal . Este manipulador é usado por subclasses para postDelay
alguns executáveis, e eu não posso gerenciá-los. Agora, no onStop
caso, preciso removê-los antes de terminar a Atividade (de alguma forma eu liguei finish()
, mas ainda assim chamo novamente e novamente). Existe alguma maneira de remover todos os retornos de chamada de um manipulador?
java
android
callback
android-handler
Luke Vo
fonte
fonte
removeCallbacksAndMessages(null)
remoção de alguns dos meus retornos de chamada. Quando eu gostaria de parar de receberhandler.removeCallbacksAndMessages(null)
retornos de chamada, chamava e definia meu manipulador como nulo, mas como ainda recebia o retorno, encontraria um NPE quando gostaria de fazer um loophandler.postDelayed()
.yourHandler.removeCallbacks(yourRunnable)
era a mais confiável. Ainda usando isso hoje.Para qualquer
Runnable
instância específica , ligueHandler.removeCallbacks()
. Observe que ele usa aRunnable
própria instância para determinar quais retornos de chamada devem ser cancelados, portanto, se você estiver criando uma nova instância cada vez que uma postagem for feita, verifique se você tem referências exatasRunnable
para cancelar. Exemplo:Você pode ligar
myHandler.postDelayed(myRunnable, x)
para postar outro retorno de chamada na fila de mensagens em outros lugares do seu código e remover todos os retornos de chamada pendentes commyHandler.removeCallbacks(myRunnable)
Infelizmente, você não pode simplesmente "limpar" o todo
MessageQueue
para aHandler
, mesmo que faça uma solicitação para oMessageQueue
objeto associado a ele, porque os métodos para adicionar e remover itens são protegidos por pacote (somente as classes do pacote android.os podem chamá-lo). Pode ser necessário criar umaHandler
subclasse fina para gerenciar uma lista deRunnable
s conforme eles são publicados / executados ... ou observar outro paradigma para passar suas mensagens entre cadaActivity
Espero que ajude!
fonte
Se você não tiver as referências Runnable, no primeiro retorno de chamada, obtenha o objetivo da mensagem e use removeCallbacksAndMessages () para remover todos os retornos de chamada relacionados.
fonte
Defina um novo manipulador e executável:
Mensagem atrasada:
Remova seu retorno de chamada do manipulador:
fonte
Observe que deve-se definir a
Handler
e aRunnable
no escopo da classe, para que seja criado uma vez.removeCallbacks(Runnable)
funciona corretamente, a menos que alguém os defina várias vezes. Veja os exemplos a seguir para entender melhor:Maneira incorreta:
Se você chamar o
onClick(..)
método, nunca interrompa adoIt()
chamada do método antes que ela seja chamada. Porque cada vez que crianew Handler
enew Runnable
instâncias. Dessa forma, você perdeu as referências necessárias que pertencem ao manipulador e executável instâncias .Maneira correta :
Dessa forma, você não perde referências reais e
removeCallbacks(runnable)
trabalha com sucesso.A frase-chave é que "defina-os como globais no seu
Activity
ou noFragment
que você usa" .fonte
Como
josh527
dito,handler.removeCallbacksAndMessages(null);
pode funcionar.Mas por que?
Se você der uma olhada no código-fonte, poderá entendê-lo mais claramente. Existem três tipos de método para remover retornos de chamada / mensagens do manipulador (o MessageQueue):
Handler.java (deixe algum método de sobrecarga)
MessageQueue.java faz o trabalho real:
fonte