postDelayed에 의해 추가 된 핸들러 객체에서 실행 파일을 제거하는 방법은 무엇입니까?
나는이 "열기" 애니메이션을하고 사용하고 Handler.postDelayed(Runnable, delay)트리거하기 위해 "가까운" 잠시 후 애니메이션. 그러나 열기와 닫기 사이의 시간 동안 클릭으로 트리거되는 다른 애니메이션이있을 수 있습니다.
제 질문은 핸들러에서 "닫기" 애니메이션을 어떻게 취소 할 수 있습니까?
removeCallbacks(Runnable r)방법을 사용하십시오 .
Cristian의 답변은 정확하지만 답변의 의견에 명시된 것과 달리 실제로 Runnables전화를 걸어 익명의 콜백을 제거 할 수 있습니다.removeCallbacksAndMessages(null);
여기에 명시된대로 :
보류중인 콜백 게시물 및 obj가 토큰 인 전송 된 메시지를 제거합니다. token이 null이면 모든 콜백과 메시지가 제거됩니다 .
이것은 늦은 답변이지만 핸들러에서 특정 범주의 실행 가능 항목 만 제거하려는 경우에 대한 다른 방법이 있습니다 (예 : OP의 경우 닫기 애니메이션을 제거하고 다른 실행 가능 항목은 대기열에 남겨 둡니다).
int firstToken = 5;
int secondToken = 6;
//r1 to r4 are all different instances or implementations of Runnable.
mHandler.postAtTime(r1, firstToken, 0);
mHandler.postAtTime(r2, firstToken, 0);
mHandler.postAtTime(r3, secondToken, 0);
mHandler.removeCallbacksAndMessages(firstToken);
mHandler.postAtTime(r4, firstToken, 0);
위 코드는 "r3"을 실행 한 다음 "r4"만 실행합니다. 이를 통해 실행 가능 항목 자체에 대한 참조를 보유 할 필요없이 토큰에 의해 정의 된 실행 가능 항목의 특정 범주를 제거 할 수 있습니다.
참고 : 소스 코드는 "=="피연산자 만 사용하여 토큰을 비교하므로 (.equals ()를 호출하지 않음) 토큰에 문자열 대신 ints / Integer를 사용하는 것이 가장 좋습니다.
재귀를 사용하는 경우 "this"를 전달하여이를 달성 할 수 있습니다. 아래 코드를 참조하십시오.
public void countDown(final int c){
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
aq.id(R.id.timer).text((c-1)+"");
if(c <= 1){
aq.id(R.id.timer).gone();
mHandler.removeCallbacks(this);
}else{
countDown(c-1);
}
}
}, 1000);
}
이 예제는 1 초마다 TextView (타이머)의 텍스트를 설정하고 카운트 다운합니다. 0이되면 UI에서 TextView를 제거하고 카운트 다운을 비활성화합니다. 이것은 재귀를 사용하는 사람에게만 유용하지만 여기에 검색하여 도착했기 때문에 결과를 게시하고 있습니다.
익명의 Runnable에 대한 콜백을 제거하려면 just run : handler = null모든 것이 제거됩니다.
'program story' 카테고리의 다른 글
| Windows의 Anaconda Python에 Keras와 Theano를 어떻게 설치합니까? (0) | 2020.11.19 |
|---|---|
| MTOM은 어떻게 작동합니까? (0) | 2020.11.19 |
| 백그라운드 스레드에서 NSTimer를 어떻게 생성합니까? (0) | 2020.11.19 |
| AngularJS에서 루트 스코프에 브로드 캐스트 이벤트를 등록 해제하려면 어떻게해야합니까? (0) | 2020.11.19 |
| IE6 + IE7 CSS 문제 오버플로 : 숨김; (0) | 2020.11.19 |