注: - 为了这个问题,我们忽略 AsyncTask。 - 我已经清楚了 Handler().postDelayed 的用例,为了这个问题假设我需要任务立即开始。
Handler h = new Handler(){
@Override
public void handleMessage(Message msg){
if(msg.what == 0){
updateUI();
}else{
showErrorDialog();
}
}
};
Thread t = new Thread() {
@Override
public void run(){
doSomeWork();
if(succeed){
//we can't update the UI from here so we'll signal our handler and it will do it for us.
h.sendEmptyMessage(0);
}else{
h.sendEmptyMessage(1);
}
}
};
总的来说,需要在进行一些可能会耗时或者计算量大的工作(例如网络操作、文件I/O、复杂算术等)时使用线程。
updateUI()
在onCreateView
之后运行(在新视图加载完成后)是否有保证? - Zyoomessage.what()
?难道不应该是 if(msg == 0){
吗?非常感谢! :) - Ruchir BaroniaHandler和Thread是两个完全不同的东西。
必须创建一个线程来执行长时间运行的作业。
Handler是在两个线程之间进行通信的非常方便的对象(例如:后台线程需要更新UI。您可以使用一个Handler从后台线程向UI线程发布一些Runnable)。
因此,您不能选择Handler或Thread。使用线程来执行重型工作!(如果您的后台线程将触发另一个线程中要执行的作业,大多数时候会使用Handler - 通常是UI线程)
Handler
和Thread
是两个不同的东西,但它们并不矛盾。你可以同时拥有一个Handler
和一个Thread
,实际上每个Handler
必须在一个Thread
中运行。
如果需要更多细节,您可以查看这篇文章。
Handler
运行在同一个Thread
上,而Thread
则运行在不同的线程上。
如果需要在同一线程上运行某些东西(通常是GUI元素或类似物),请使用Handler。
如果要保持主线程空闲以执行其他任务,请使用Thread。适用于任何需要较长时间的操作。
Handler是在后台线程和UI线程之间进行通信的最佳方式。通常,Handler与一个线程的消息队列相关联,用于向消息队列发送消息和可运行对象。
用途:
线程:在独立的(后台)线程中执行任务,而不是在UI线程中执行。(有助于解除UI线程的阻塞)
Handler:用于在UI线程和后台线程之间进行通信。
请查看此文章
ThreadPoolExecutor
或 ExecutorService
API。
(从您在 Blackbelt 答案评论中提取的此查询)
为什么不使用 Executor?即使我确实想使用 Handler 来执行该操作,该怎么做?
参考文献:Thread Performance article
有些工作可以简化为高度并行的分布式任务。由于这会产生大量的工作包,因此 AsyncTask
和 HandlerThread
不是合适的类。 AsyncTask
的单线程特性会将所有线程池化的工作转换为线性系统。另一方面,使用 HandlerThread
类需要程序员手动管理一组线程之间的负载平衡。
BlockingQueue workQueue= new LinkedBlockingQueue<Runnable>(100); // Work pool size
ThreadPoolExecutor executor = new ThreadPoolExecutor(
Runtime.getRuntime().availableProcessors(), // Initial pool size
Runtime.getRuntime().availableProcessors(), // Max pool size
1, // KEEP_ALIVE_TIME
TimeUnit.SECONDS, // KEEP_ALIVE_TIME_UNIT
workQueue);
Handler
运行多个Runnable实例的用法。在这种情况下,所有Runnable
任务将在单个线程中运行。
Android:在线程中使用Toast
Handler
可以与 Thread
结合使用,以创建队列机制。您可以使用 handler
将某些内容发布到 Thread
的 Looper
上。
如果您需要在主线程之外单独执行一次任务,则使用Thread。如果您想重复执行任务,则Android提供了一种保持线程活动并接收消息或Runnable对象以使用MessageQueue处理它们的方法。