핸들러에서 모든 콜백을 제거하는 방법은 무엇입니까?
-
28-10-2019 - |
해결책
내 경험상 이것을 호출하는 것은 훌륭했습니다! 라코 디스
removeCallbacksAndMessages에 대한 문서에서 다음과 같이 말합니다 ... <인용구>
대기중인 콜백 게시물과 obj가 토큰 인 전송 된 메시지를 제거합니다. 토큰이 null
인 경우 모든 콜백과 메시지가 제거됩니다.
다른 팁
특정 Runnable
인스턴스의 경우 Handler.removeCallbacks()
를 호출하세요. 등록 취소 할 콜백을 결정하기 위해 Runnable
인스턴스 자체를 사용하므로 게시 할 때마다 새 인스턴스를 생성하는 경우 취소 할 정확한 Runnable
에 대한 참조가 있는지 확인해야합니다. 예 :
라코 디스
myHandler.postDelayed(myRunnable, x)
를 호출하여 코드의 다른 위치에있는 메시지 대기열에 또 다른 콜백을 게시하고 myHandler.removeCallbacks(myRunnable)
로 보류중인 모든 콜백을 제거 할 수 있습니다.
안타깝게도 항목을 추가하고 제거하는 메서드가 패키지로 보호되기 때문에 해당 항목과 관련된 MessageQueue
객체를 요청하더라도 Handler
에 대한 전체 MessageQueue
를 단순히 "지울"수 없습니다 (android.os 내의 클래스 만 패키지는 그들을 부를 수 있습니다). 게시 / 실행될 때 Handler
목록을 관리하기 위해 얇은 Runnable
하위 클래스를 만들어야 할 수도 있습니다 ... 또는 각 Activity
간에 메시지를 전달하기위한 다른 패러다임을 살펴 봐야 할 수도 있습니다.
도움이되기를 바랍니다!
Runnable 참조가없는 경우 첫 번째 콜백에서 메시지의 obj를 가져 와서 removeCallbacksAndMessages () 는 모든 관련 콜백을 제거합니다.
새 핸들러 및 실행 가능 정의 : 라코 디스
통화 게시 지연 : 라코 디스
핸들러에서 콜백 제거 : 라코 디스
클래스 범위에서 Handler
와 Runnable
를 정의하여 한 번 생성되도록해야합니다 .removeCallbacks(Runnable)
는 여러 번 정의하지 않는 한 올바르게 작동합니다.더 나은 이해를 위해 다음 예를 참조하십시오.
잘못된 방법 : 라코 디스
onClick(..)
메서드를 호출하면 호출하기 전에 doIt()
메서드 호출을 중지하지 않습니다.매번 new Handler
및 new Runnable
인스턴스를 생성하기 때문입니다.이런 식으로 handler 및 runnable 인스턴스에 속하는 필요한 참조를 잃었습니다.
올바른 방법 : 라코 디스
이렇게하면 실제 참조를 잃지 않고 removeCallbacks(runnable)
가 성공적으로 작동합니다.
핵심 문장은 '사용하는 Activity
또는 Fragment
에서 전역으로 정의'한다는 것입니다.
josh527
가 말했듯이 handler.removeCallbacksAndMessages(null);
는 작동 할 수 있습니다.
그런데 왜?
소스 코드를 살펴보면 더 명확하게 이해할 수 있습니다.
핸들러 (MessageQueue)에서 콜백 / 메시지를 제거하는 방법에는 3 가지 유형이 있습니다.
- 콜백 (및 토큰)으로 제거
- message.what (및 토큰)으로 제거
- 토큰으로 제거
Handler.java (오버로드 방법은 남겨 두세요) 라코 디스
MessageQueue.java는 실제 작업을 수행합니다. 라코 디스