处理程序与AsyncTask

我很困惑,何时会select一个处理程序的AsyncTask。 说我有一些代码,我想运行每n秒将更新用户界面。 为什么我会select一个呢?

国际海事组织(IMO)编写的AsyncTask是为了在Android应用程序中实现后台处理而提供一种方便,易用的方式,而不用担心太多低级细节(线程,消息循环等)。 它提供了callback方法,有助于安排任务,并在需要时轻松更新UI。

然而,重要的是要注意,当使用AsyncTask时,开发人员正在提交其限制,这是由于类作者所做的devise决定而产生的。 例如,我最近发现,使用AsyncTasks可以调度的作业数量是有限制的。

处理程序是更透明的两个,可能会给你更多的自由; 所以如果你想更多的控制你会select处理程序,否则AsynTask将工作得很好。

我的经验法则是:

  • 如果您正在做一些与UI相关的独立function,例如将数据下载到列表中,请继续使用AsyncTask

  • 如果您正在执行多个重复任务,例如下载多个在ImageViews显示的ImageViews (如下载缩略图),请使用Handler的任务队列。

请尽可能避免使用AsyncTask,主要原因如下:

  • AsyncTask不能保证运行,因为有一个由系统设置的ThreadPool基础和最大大小,如果你创build了太多的asynctask,它们将最终被销毁

  • AsyncTask可以自动终止,即使在运行时也是如此,具体取决于活动的生命周期,并且您无法控制它

  • 在UI线程上运行的AsyncTask方法(如onPostExecute)可以在其所引用的Activity不可见或可能处于不同的布局状态(如方向更改后)时执行。

总之你不应该使用AsyncTask的UIThread-linked方法,这是它的主要优势! 而且,你只能在doInBackground上做非关键的工作。 阅读此主题以获取关于此问题的更多见解:

AsyncTask是真的在概念上有缺陷还是我错过了什么?

总结一下,如果上面提到的任何问题都可能成为您的担忧,那么可以尝试使用IntentServices,HandlerThread或ThreadPoolExecutor而不是AsyncTask。 当然这需要更多的工作,但是你的申请会更安全。

如果你想每x秒进行一次计算,你应该在一个Handler (使用postDelayed() )上安排一个Runnable ,并且该Runnable应该在当前的UI线程中启动。 如果您想在另一个线程中启动它,请使用HandlerThread。 AsyncTask对于我们来说更容易使用,但并不比处理程序更好。

处理程序与应用程序的主线程相关联。 它处理和调度从后台线程发送到应用程序主线程的消息和可运行。

AsyncTask提供了一个简单的方法来处理后台线程,以便更新UI而不会因耗费时间的操作而阻塞它。

答案是两者都可以用来从后台线程更新用户界面,不同之处在于你的执行场景。 您可以考虑使用处理程序来发送延迟的消息或将消息以特定的顺序发送到MessageQueue。

你可以考虑使用AsyncTask,如果你想交换参数(从而更新UI)在应用程序的主线程和后台线程之间的一个简单的方便。

他们是最好的面试问题。 AsyncTask – 它们用于卸载UI线程并在后台执行任务。 处理程序 – Android dosent在UI和后台线程之间有直接的通信方式。 必须使用处理程序发送消息或通过消息队列运行。

因此,AsyncTasks用于需要在后台执行任务的地方,Handlers用于UI和Background Thread之间的通信。

AsyncTask假定在一些后台工作完成之后,你将在UI线程上做些什么。 而且, 你只能执行一次 (在这之后,它的状态是FINISHED ,你会得到一个exception,试图再次执行它)。 而且,使用它的灵活性不大。 是的,你可以使用THREAD_POOL_EXECUTOR进行并行执行,但是这样做可能不值得。

除了处理Runnables和Messages之外, Handler不会推定任何东西。 而且,它可以根据需要多次运行 。 你可以自由决定要把哪个线程连接到它,如何与其他处理程序通信,也许用HandlerThread生成它们。 所以,它更加灵活,适合一些重复的工作。

在这里检查不同types的Handler示例。

doInBackground – 基本上可以在另一个线程中工作。 onPostExecute – 在UI线程上发布结果,并在内部发送消息给主线程的处理程序。 主UI线程已经有一个循环和处理程序相关联。

所以基本上,如果你不得不做一些后台任务,使用AsyncTask。 但最终,如果需要在UI上更新,它将使用主线程的处理程序。