Answers:
IMO,AsyncTask的编写目的是提供一种便捷,易于使用的方式来实现Android应用程序中的后台处理,而不必过多担心底层细节(线程,消息循环等)。它提供了回调方法,可帮助安排任务并在需要时轻松更新UI。
但是,必须注意,使用AsyncTask时,开发人员正在屈从于其局限性,这是由于该类作者做出的设计决定所致。例如,我最近发现使用AsyncTasks可以调度的作业数量有限制。
Handler对这两者更透明,并且可能会给您更多自由。因此,如果您想对事物进行更多控制,则可以选择Handler,否则AsynTask可以正常工作。
AsyncTasks在一个线程上执行,因此不再有并行性。您仍然可以在并行Executor实现中运行它们。
我的经验法则是:
如果您要进行与UI相关的孤立操作,例如下载数据以显示在列表中,请继续使用AsyncTask。
如果您要执行多个重复任务,例如下载要在ImageViews下载时显示的多个图像(例如下载缩略图),请使用带有的任务队列Handler。
始终尽量避免使用AsyncTask,主要是由于以下原因:
由于系统设置了ThreadPool基数和最大大小,因此不能保证AsyncTask可以运行。如果创建的asynctask过多,它们最终将被销毁
AsyncTask甚至可以在运行时自动终止,具体取决于活动生命周期,您无法对其进行控制
在UI线程上运行的AsyncTask方法(例如onPostExecute)可以在其所引用的活动(该活动不再可见)或可能处于不同的布局状态(例如更改方向)后执行。
总之,您不应该使用AsyncTask的UIThread链接方法,这是它的主要优点!!!此外,您只应在doInBackground上执行非关键性的工作。阅读此主题以获取有关此问题的更多见解:
AsyncTask在概念上确实存在缺陷吗?还是我只是想念一些东西?
总结一下,当上述任何问题可能引起您的关注时,请尝试使用IntentServices,HandlerThread或ThreadPoolExecutor而不是AsyncTask。当然,这将需要更多的工作,但您的应用程序将更安全。
处理程序与应用程序的主线程关联。它处理和调度从后台线程发送到应用程序主线程的消息和可运行对象。
AsyncTask提供了一种简单的方法来处理后台线程,以便更新UI而不用耗时的操作阻止它。
答案是两者都可用于从后台线程更新UI,不同之处在于您的执行方案。您可以考虑使用处理程序来发布延迟的消息或以特定顺序将消息发送到MessageQueue。
如果您想以一种方便的方式在应用程序主线程和后台线程之间交换参数(从而更新UI),则可以考虑使用AsyncTask。
他们是最好的面试问题。 AsyncTask-它们用于卸载UI线程并在后台执行任务。 处理程序 -Android主体具有UI和后台线程之间直接的通信方式。处理程序必须用于发送消息或可通过消息队列运行。
因此,AsyncTasks用于需要在后台执行任务的地方,而Handlers用于UI和Background Thread之间的通信。
doInBackground-基本上可以在另一个线程中工作。 onPostExecute-将结果发布到UI线程上,并且在内部将消息发送到主线程的处理程序。主UI线程已具有与它相关联的循环程序和处理程序。
因此,基本上,如果您必须执行一些后台任务,请使用AsyncTask。但是最终,如果需要在UI上进行某些更新,它将使用主线程的处理程序。