수색…


비고

처리기는 지연된 시간이 지나면 코드를 쉽게 실행할 수 있습니다. Runnable의 run () 메소드 내에서 Handler.postDelayed () 메서드를 다시 호출하여 지정된 시간이 지난 후 코드를 반복적으로 실행하는 경우에도 유용합니다.

지연된 시간 후에 처리기를 사용하여 코드 실행

1.5 초 후 코드 실행 :

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        //The code you want to run after the time is up
    }
}, 1500); //the time you want to delay in milliseconds

1 초마다 반복적으로 코드 실행 :

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        handler.postDelayed(this, 1000);
    }
}, 1000); //the time you want to delay in milliseconds

HandlerThreads와 스레드 간의 통신

Handler 는, MessageRunnable 를 Thread의 메세지 큐에 송신하기 위해서 (때문에), 복수의 Thread 간의 이벤트베이스의 통신을 구현하기 쉽습니다. Looper 있는 모든 스레드는 메시지를 수신하고 처리 할 수 ​​있습니다. HandlerThread 는 그러한 Looper 를 구현하는 Thread입니다. 예를 들어, Main Thread (UI Thread)는 HandlerThread 의 기능을 구현합니다.

현재 스레드에 대한 핸들러 작성

Handler handler = new Handler();

기본 스레드 (UI 스레드)에 대한 처리기 만들기

Handler handler = new Handler(Looper.getMainLooper());

다른 thread로부터 Runnable를 메인 thread에 송신한다

new Thread(new Runnable() {
    public void run() {
        // this is executed on another Thread

        // create a Handler associated with the main Thread
        Handler handler = new Handler(Looper.getMainLooper());

        // post a Runnable to the main Thread
        handler.post(new Runnable() {
            public void run() {
                // this is executed on the main Thread
            }
        });
    }
}).start();

다른 HandlerThread에 대한 핸들러 작성 및 이벤트 보내기

// create another Thread
HandlerThread otherThread = new HandlerThread("name");

// create a Handler associated with the other Thread
Handler handler = new Handler(otherThread.getLooper());

// post an event to the other Thread
handler.post(new Runnable() {
    public void run() {
        // this is executed on the other Thread
    }
});

실행에서 핸들러 중지

핸들러가 실행되지 않게하려면 그 내부에서 실행되는 runnable을 사용하여 핸들러에 연결된 콜백을 제거하십시오.

Runnable my_runnable = new Runnable() {
    @Override
    public void run() {
        // your code here
    }
};

public Handler handler = new Handler(); // use 'new Handler(Looper.getMainLooper());' if you want this handler to control something in the UI
// to start the handler
public void start() {
    handler.postDelayed(my_runnable, 10000);
}

// to stop the handler
public void stop() {
    handler.removeCallbacks(my_runnable);
}

// to reset the handler
public void restart() {
    handler.removeCallbacks(my_runnable);
    handler.postDelayed(my_runnable, 10000);
}

핸들러를 사용하여 Timer 만들기 (javax.swing.Timer와 유사)

이것은 몇 초마다 코드 조각을 실행해야하는 게임이나 무언가를 작성하는 경우에 유용 할 수 있습니다.

import android.os.Handler;

public class Timer {
    private Handler handler;
    private boolean paused;

    private int interval;

    private Runnable task = new Runnable () {
        @Override
        public void run() {
            if (!paused) {
                runnable.run ();
                Timer.this.handler.postDelayed (this, interval);
            }
        }
    };

    private Runnable runnable;

    public int getInterval() {
        return interval;
    }

    public void setInterval(int interval) {
        this.interval = interval;
    }

    public void startTimer () {
        paused = false;
        handler.postDelayed (task, interval);
    }

    public void stopTimer () {
        paused = true;
    }

    public Timer (Runnable runnable, int interval, boolean started) {
        handler = new Handler ();
        this.runnable = runnable;
        this.interval = interval;
        if (started)
            startTimer ();
    }
}

사용 예 :

Timer timer = new Timer(new Runnable() {
    public void run() {
        System.out.println("Hello");
    }
}, 1000, true)

이 코드는 매초 "Hello"를 인쇄합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow