Лучший способ периодически выполнять действие [во время работы приложения] - Обработчик? - PullRequest
11 голосов
/ 28 марта 2011

Я пытаюсь периодически выполнять действие.Я хочу создать новый экземпляр класса, скажем, через 3 секунды.Будет ли лучше реализовать это с помощью обработчика или потока?Есть ли какой-нибудь более лёгкий, чокнутый способ, которым я мог бы попробовать?Я действительно не очень хорош в использовании потоков - я хочу учиться, но более важно, чтобы я заработал это, прежде чем беспокоиться о хорошей практике программирования.

    new Thread(){
        public void run(){
            //makes sure the player still has 3 lives left
            while(game == false){
                uiCallback.sendEmptyMessage(0);
                try {
                    Thread.sleep(2000); // wait two seconds before drawing the next flower
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } //sleep for 2 seconds
            }
        }
    }.start();

Ответы [ 3 ]

13 голосов
/ 28 марта 2011

Я делаю нечто подобное в моем приложении для Android;Я обновляю некоторые данные в моем интерфейсе каждые 10 секунд.Есть много способов сделать это, но я решил использовать Handler, потому что это очень просто реализовать:

Thread timer = new Thread() {
    public void run () {
        for (;;) {
            // do stuff in a separate thread
            uiCallback.sendEmptyMessage(0);
            Thread.sleep(3000);    // sleep for 3 seconds
        }
    }
});
timer.start();
...
private Handler uiCallback = new Handler () {
    public void handleMessage (Message msg) {
        // do stuff with UI
    }
};

Как вы, возможно, знаете, вы не можете запускать периодические функции, подобные этой, в потоке пользовательского интерфейса,потому что это заблокирует пользовательский интерфейс.Это создаст новый Thread, который отправит сообщение в пользовательский интерфейс, когда это будет сделано, поэтому вы можете обновить свой пользовательский интерфейс новыми результатами того, что делает ваша периодическая функция.

Если вам не нужно обновлятьПользовательский интерфейс с результатами этой периодической функции, вы можете просто проигнорировать вторую половину моего примера кода и просто создать новый Thread, как показано.Однако, будьте осторожны: если вы изменяете переменные, совместно используемые этим новым Thread и пользовательским интерфейсом, у вас возникнут проблемы, если вы не синхронизируете.В общем случае многопоточность - это не та область, в которой вы хотите игнорировать «хорошие методы программирования», потому что вы получите странные, непредсказуемые ошибки и будете проклинать вашу программу.

-tjw

9 голосов
/ 28 марта 2011

Самое простое - использовать postDelayed() на View (например, виджете), чтобы запланировать Runnable, который действительно работает, а затем перепланировать себя.

0 голосов
/ 23 марта 2018
// We need to use this Handler package
import android.os.Handler;

// Create the Handler object (on the main thread by default)

Handler handler = new Handler();

// Define the code block to be executed

private Runnable runnableCode = new Runnable() {
    @Override
    public void run() {
      // Do something here on the main thread
      Log.d("Handlers", "Called on main thread");
      // Repeat this the same runnable code block again another 2 secs
      // 'this' is referencing the Runnable object
      handler.postDelayed(this, 2000);
    }
};
// Start the initial runnable task by posting through the handler
handler.post(runnableCode);
...