我想知道,如果我希望在一个标志为真的情况下每五秒钟执行一次任务,我应该使用什么。我是在一个很好的设备上运行的,所以性能很重要。
选项一是使用Handler:
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);
}第二个选择是使用线程:
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();
}你喜欢用什么?有没有更好的解决办法?
发布于 2016-02-02 14:07:15
不应该有任何一种选择,而应该知道不同之处,并选择最适合具体情况的选项。
postDelayed
在这种情况下,代码将在附加处理程序的同一个线程上运行。
--如果--这是您的主(UI)线程--那么确保您不会使用此方法执行长时间运行的任务。
这也意味着您不能保证任务每5秒精确运行一次。如果处理程序线程繁忙,则您的任务将不得不等待。
新螺纹
在第二种情况下,将产生一个新线程来处理这个任务。在我看来,这只适合在线程与应用程序具有相同的生存期并经常繁忙的情况下考虑。否则,我将使用一条信息,如在第一或第三个选项中,您没有列出:
AsyncTask
它非常支持在任务运行后更新UI。
默认情况下,异步任务在共享线程上运行,但可以在线程池线程上执行:
new YourAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);IntentService
运行专用线程的另一种选择是启动服务。它有自己的生命周期,不像异步任务那样受UI生命周期的影响。
TimerTask
这是可用的,但与postDelayed技术相比,我不知道有什么优势。
https://stackoverflow.com/questions/35154003
复制相似问题