문제

내 하위 활동에서 호출 된 Handler 가 있습니다.기본 활동 .이 핸들러는 postDelay 일부 Runnable을 관리 할 수 없습니다.이제 onStop 이벤트에서 Activity를 완료하기 전에 제거해야합니다.어쨌든 핸들러에서 모든 콜백을 제거 할 수 있습니까?

도움이 되었습니까?

해결책

내 경험상 이것을 호출하는 것은 훌륭했습니다! 라코 디스

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 () 는 모든 관련 콜백을 제거합니다.

새 핸들러 및 실행 가능 정의 : 라코 디스

통화 게시 지연 : 라코 디스

핸들러에서 콜백 제거 : 라코 디스

클래스 범위에서 HandlerRunnable를 정의하여 한 번 생성되도록해야합니다 .removeCallbacks(Runnable)는 여러 번 정의하지 않는 한 올바르게 작동합니다.더 나은 이해를 위해 다음 예를 참조하십시오.

잘못된 방법 : 라코 디스

onClick(..) 메서드를 호출하면 호출하기 전에 doIt() 메서드 호출을 중지하지 않습니다.매번 new Handlernew Runnable 인스턴스를 생성하기 때문입니다.이런 식으로 handler runnable 인스턴스에 속하는 필요한 참조를 잃었습니다.

올바른 방법 : 라코 디스

이렇게하면 실제 참조를 잃지 않고 removeCallbacks(runnable)가 성공적으로 작동합니다.

핵심 문장은 '사용하는 Activity 또는 Fragment에서 전역으로 정의'한다는 것입니다.

josh527가 말했듯이 handler.removeCallbacksAndMessages(null);는 작동 할 수 있습니다.
그런데 왜?
소스 코드를 살펴보면 더 명확하게 이해할 수 있습니다. 핸들러 (MessageQueue)에서 콜백 / 메시지를 제거하는 방법에는 3 가지 유형이 있습니다.

  1. 콜백 (및 토큰)으로 제거
  2. message.what (및 토큰)으로 제거
  3. 토큰으로 제거

    Handler.java (오버로드 방법은 남겨 두세요) 라코 디스

    MessageQueue.java는 실제 작업을 수행합니다. 라코 디스

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top