handler.postdelayed 프로세스 취소


259

handler.postDelayed()앱의 다음 단계가 시작되기 전에 대기 기간을 만드는 데 사용 하고 있습니다. 대기 시간 동안 진행률 표시 줄과 취소 버튼이 있는 대화 상자가 표시 됩니다.

내 문제는 시간이 지나기 전에 postDelayed 작업 을 취소 하는 방법을 찾을 수 없다는 것 입니다.



이 요지가 도움이 되기를 바랍니다 .
Mubin

답변:


479

지연된 실행 파일을 게시하기 위해이 작업을 수행합니다.

myHandler.postDelayed(myRunnable, SPLASH_DISPLAY_LENGTH); 

그리고 이것을 제거하려면 : myHandler.removeCallbacks(myRunnable);


74
처리기에서 모든 콜백과 메시지를 취소 할 수 있고 실행 가능한 항목에 대한 참조를 유지하지 않으려는 경우이 질문에 대한 대답의 세 번째 지점은 어쨌든 내 경우에는 효과가있는 또 다른 대안입니다 : stackoverflow. com / questions / 11299440 /… (본질적으로 myHandler.removeCallbacksAndMessages (null);) 호출
Mick

removeCallbacksAndMessages는 트릭을 수행 할 수 있지만 개인적으로 예약 된 런너 블을 제어하는 ​​것을 선호합니다. 한 쌍의 Runnable을 인스턴스화하고 처리한다고해서 앱 성능이 저하되지는 않습니다. 그렇지 않으면 2 ~ 3 개 이상의 Runnable이 필요한 경우 더 강력한 무언가가 필요할 수 있습니다.
andrea.rinaldi

59

동일한 핸들러에 여러 개의 내부 / 익명 런너 블이 전달되고 동일한 이벤트 사용시 모두 취소하려는 경우

handler.removeCallbacksAndMessages(null);

설명서에 따라

대기중인 콜백 게시물과 obj가 토큰 인 메시지를 삭제합니다. token이 null이면 모든 콜백 및 메시지가 제거됩니다.


이렇게하면 실행 가능한 모든 콜백이 한 번 제거됩니다. 그렇지 않으면, removeCallbacks(callback) 특정 콜백을 제거하기 위해 전화
FindOutIslamNow 2016 년

18

또 다른 방법은 Runnable 자체를 처리하는 것입니다.

Runnable r = new Runnable {
    public void run() {
        if (booleanCancelMember != false) {
            //do what you need
        }
    }
}

14
booleanCancelMember가 최종적이어야하지 않습니까? 변경이 불가능하여이 목적에 쓸모가 없습니까?
stealthcopter 2016 년

9
@ stealthcopter 아니오 필요는 없습니다.
Benoit Jadinon

7
@pablisco Runnable이 익명이더라도 최종일 필요는 없습니다. 엔 클로징 클래스의 멤버 일 수 있습니다.
Martin

6
이것을 억제하지 말고 조심하십시오. 이 방법을 사용하면 여러 개의 Runnable이 지연된 것으로 게시되면 심한 경쟁 조건에 처할 수 있습니다. 이것은 Runnable을 취소하지 않으므로 해당 코드의 실행 여부는 게시 된 Runnable 의 특정 순간에 booleanCancelMember의 값에 따라 다릅니다 . 빨리 예측할 수 없게 될 수 있습니다.
Dennis K

1
Runnable이 익명이 아니면 r사용할 수 있음을 의미 하는 ( 이 경우) 참조가 있음을 의미합니다 myHandler.removeCallbacks(r);. Runnable이 익명 인 경우 플래그는 클래스를 묶는 클래스의 멤버가됩니다. 즉, 플래그를 변경하려면 해당 오브젝트에 대한 참조가 필요합니다 . r즉, 어쨌든 다시 가져와야 myHandler.removeCallbacks(r);합니다. 그리고 내가하고 있다면 myHandler.removeCallbacks(r);그러한 깃발은 전혀 필요하지 않습니다. 뭔가 빠졌습니까?
nacho4d

1

다음은 지연 조치에 대한 취소 메소드를 제공하는 클래스입니다.

public class DelayedAction {

private Handler _handler;
private Runnable _runnable;

/**
 * Constructor
 * @param runnable The runnable
 * @param delay The delay (in milli sec) to wait before running the runnable
 */
public DelayedAction(Runnable runnable, long delay) {
    _handler = new Handler(Looper.getMainLooper());
    _runnable = runnable;
    _handler.postDelayed(_runnable, delay);
}

/**
 * Cancel a runnable
 */
public void cancel() {
    if ( _handler == null || _runnable == null ) {
        return;
    }
    _handler.removeCallbacks(_runnable);
}}

0

부울을 통해 전달하여 게시 가능한 지연 가능한 게시물 내에서 CancelCallBacks (this)를 호출했을 때 저에게 효과적이었습니다.

Runnable runnable = new Runnable(){
    @Override
    public void run() {
        Log.e("HANDLER", "run: Outside Runnable");
        if (IsRecording) {
            Log.e("HANDLER", "run: Runnable");
            handler.postDelayed(this, 2000);
        }else{
            handler.removeCallbacks(this);
        }
    }
};

3
코드에 "CancelCallBacks"가 없습니다. 아마도 존재하지 않기 때문일까요? :)
놀라운 1 월

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.