我想知道如果我希望在标志为真时每五秒钟执行一次任务,我应该使用什么。我在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();
}
您更喜欢使用什么?有更好的解决方案吗?
答案 0 :(得分:1)
应该没有一个选项可供选择,而是要了解差异并选择最适合特定情况的选项。
在这种情况下,代码将在处理程序附加到的同一个线程上运行。
如果这是您的主(UI)线程,请确保您不使用此方法执行长时间运行的任务。
这也意味着您无法保证任务每5秒钟就会运行一次。如果处理程序线程忙,则您的任务必须等待。
在第二种情况下,新的线程将被启动以处理此任务。当线程与应用程序具有相同的生命周期并且经常繁忙时,这仅适用于我的视图。否则,我将使用您未列出的第一个或第三个选项中的消息:
它非常支持在任务运行后更新UI。
默认情况下,异步任务在共享线程上运行,但您可以在线程池线程上执行:
new YourAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
IntentService
运行专用线程的另一种方法是启动服务。这有它自己的生命周期,并且不受像async任务那样的UI生命周期的影响。
这是可用的,但我对postDelayed
技术没有任何了解。