当我需要异步运行的东西(例如长时间运行的任务或使用网络的逻辑),或出于任何原因,启动新线程并运行它可以正常工作。创建一个处理程序并运行它也可以正常工作。有什么不同?我什么时候应该使用每个?使用a Handler
和不使用a的优点/原因是Thread
什么?
PS。-为了这个问题,让我们忽略AsyncTask
。- Handler().postDelayed
用例对我来说很清楚,为这个问题,让我们假设我需要立即启动任务。
当我需要异步运行的东西(例如长时间运行的任务或使用网络的逻辑),或出于任何原因,启动新线程并运行它可以正常工作。创建一个处理程序并运行它也可以正常工作。有什么不同?我什么时候应该使用每个?使用a Handler
和不使用a的优点/原因是Thread
什么?
PS。-为了这个问题,让我们忽略AsyncTask
。- Handler().postDelayed
用例对我来说很清楚,为这个问题,让我们假设我需要立即启动任务。
Answers:
如果您正在做的事情“繁重”,则应在线程中进行。如果您未在其自己的线程中显式启动它,则它将在主(UI)线程上运行,这可能会引起用户紧张不安或响应界面缓慢。
有趣的是,在使用线程时,将Handler用作正在启动的工作线程与主线程之间的通信方式通常也很有用。
典型的线程/处理程序交互可能看起来像这样:
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);
}
}
};
总的来说,带回家的是,您应该在执行某些可能会长时间运行或非常密集的工作(即任何网络,文件IO,繁琐的运算等)时,都应使用Thread。
updateUI()
会在onCreateView
加载新视图之后运行?
message.what()
?不是if(msg == 0){
吗?非常感谢!:)
Handler
和Thread
是两种不同的事物,但它们并不相互矛盾。您可以同时有一个Handler
和一个Thread
,实际上每个都Handler
必须在中运行Thread
。
有关更多详细信息,您可能需要查看本文。
A Handler
在相同的线程上运行Thread
,a Thread
在不同的线程上运行。
如果需要在同一线程上运行某些内容,请使用处理程序(通常是GUI元素或类似的东西),。
如果您想让主线程自由执行其他操作,请使用线程。将此用于花费大量时间的任何事情。
处理程序是后台和UI线程之间进行通信的最佳方式。通常,处理程序与线程的消息队列相关联,它们用于发送消息并可运行到消息。
用:
线程:在saperate(Background)线程中比UI线程执行任务。(有助于解锁UI线程)
处理程序用于在UI和后台线程之间进行通信。
看看这篇文章
使用处理程序而不是线程的优点/原因是什么?
一个处理程序允许您发送和处理信息和Runnable
对象与线程的关联MessageQueue
。每Handler
实例都与一个线程和该线程的消息队列关联。
当您创建一个新的 Handler
,它将绑定到正在创建它的线程的线程/消息队列中-从那时起,它将把消息和可运行对象传递到该消息队列,并在它们从消息队列中出来时执行它们。
处理程序有两个主要用途:
如果使用Java线程,则必须自己处理一些事情-与主线程同步,取消线程等。
除非您使用ThreadPoolExecutor
或ExecutorService
API,否则该单个线程不会创建线程池。
(从您对Blackbelt答案的评论中选取此查询)
为什么不使用执行器?即使我确实想使用Handler来做到这一点,怎么办?
参考:线程性能文章
有些工作类型可以简化为高度并行的分布式任务。随着工作的绝对数量包,此造成的,AsyncTask
而HandlerThread
不是适当的类。的单线程性质AsyncTask
会将所有线程池化的工作变成线性系统。HandlerThread
另一方面,使用该类将要求程序员手动管理一组线程之间的负载平衡。
ThreadPoolExecutor是使该过程更容易的帮助器类。此类管理一组线程的创建,设置它们的优先级,并管理工作在这些线程之间的分配方式。随着工作负载的增加或减少,该类启动或破坏更多线程以适应工作负载。
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);
您可以参考有关create-threadpool的此开发人员指南文章,以了解更多详细信息。
查看这篇文章,了解Handler
如何运行多个Runnable实例。在这种情况下,所有Runnable
任务将在单个线程中运行。
Handler
可以与一起使用Thread
以创建排队机制。您可以使用Uou handler
在Thread
Looper