使用Handler或Thread with while?

时间:2016-02-02 12:49:41

标签: java android multithreading android-handler

我想知道如果我希望在标志为真时每五秒钟执行一次任务,我应该使用什么。我在andrid设备上运行它,因此性能很重要。

选项一是使用处理程序:

public void handleLocation() {
    handler.postDelayed(new Runnable() {
        public void run() {
            Toast.makeText(mContext, "Five Seconds", Toast.LENGTH_SHORT).show();          // this method will contain your almost-finished HTTP calls
            if (currentLocation != null && isWorking) {
                setMockLocation(currentLocation);
                setMockLocation2(currentLocation);
            }
            handler.postDelayed(this, FIVE_SECONDS);
        }
    }, FIVE_SECONDS);
}

第二个选项是Thread:

 public void run() {
    Thread thread = new Thread() {
        @Override
        public void run() {
            try {
                while (true) {
                    if (isWorking) {
                        if (currentLocation != null)
                            setMockLocation(currentLocation);
                        setMockLocation2(currentLocation);
                    }
                    sleep(5000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
                Toast.makeText(mContext, mContext.getString(R.string.err0_unknown), Toast.LENGTH_LONG).show();
            }
        }
    };

    thread.start();
}

您更喜欢使用什么?有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

应该没有一个选项可供选择,而是要了解差异并选择最适合特定情况的选项。

postDelayed

在这种情况下,代码将在处理程序附加到的同一个线程上运行。

如果这是您的主(UI)线程,请确保您不使用此方法执行长时间运行的任务。

这也意味着您无法保证任务每5秒钟就会运行一次。如果处理程序线程忙,则您的任务必须等待。

新主题

在第二种情况下,新的线程将被启动以处理此任务。当线程与应用程序具有相同的生命周期并且经常繁忙时,这仅适用于我的视图。否则,我将使用您未列出的第一个或第三个选项中的消息:

AsyncTask

它非常支持在任务运行后更新UI。

默认情况下,异步任务在共享线程上运行,但您可以在线程池线程上执行:

new YourAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);

IntentService

运行专用线程的另一种方法是启动服务。这有它自己的生命周期,并且不受像async任务那样的UI生命周期的影响。

TimerTask

这是可用的,但我对postDelayed技术没有任何了解。