Поиск…


замечания

Обработчик может быть легко использован для выполнения кода после отложенного времени. Это также полезно для выполнения кода повторно через определенное количество времени, вызывая метод Handler.postDelayed () снова из метода Runnable run ().

Использование обработчика для выполнения кода после задержки времени

Выполнение кода через 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 и связь между Threads

Поскольку Handler используются для отправки Message s и Runnable s в очередь сообщений Thread, легко реализовать связь на основе событий между несколькими Threads. Каждый поток, имеющий Looper , способен принимать и обрабатывать сообщения. HandlerThread - это HandlerThread , который реализует такой Looper , например, главный Thread ( HandlerThread пользовательского интерфейса) реализует функции HandlerThread .

Создание обработчика для текущей темы

Handler handler = new Handler();

Создание обработчика для основного потока (поток пользовательского интерфейса)

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

Отправить Runnable из другого потока в главную тему

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);
}

Используйте Handler для создания таймера (аналогично 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