Handler(MessageQueue)和AsyncTask(SERIAL_EXECUTOR)有什么区别,性能明智?

时间:2012-08-04 23:08:50

标签: android multithreading android-asynctask android-handler

在您的应用中,有几种方法可以异步获取数据。一个是Handler,另一个是AsyncTask。现在我已经使用了两者,并且想知道哪一个在某些任务中表现更好/更有效。

因此,我主要使用AsyncTasks获取Webdata,Handler获取从ServicesActivities的数据。

我想知道将Handler用于Webdata或使用AsyncTasks从Services刷新UI是否有优势。有什么大不同?

2 个答案:

答案 0 :(得分:4)

AsyncTask uses a Handler以来,您的比较是......奇怪的。

AsyncTask非常适合交易工作:需要花费超过几毫秒且不到几分钟的内容。对于这类工作,如果您不需要自己的线程管理,AsyncTask通常更易于使用。

如果您的线程需要一些AsyncTask无法轻易处理的特性,或者您需要线程一段不确定的时间(例如,直到用户按下“停止”按钮),使用您自己的线程和其他东西来完成主应用程序线程的工作:Handlerpost()runOnUiThread()。 “不确定的时间段”建议假设您正在使用其中一个内置线程池 - 我从来不会将线程从您未设置的线程池中占用。

答案 1 :(得分:1)

看起来AsyncTask使用自己的内部处理程序。我的测试是使用Handler的“帖子”立即排队。在onCreate中使用时,这可能会有问题,因为其他操作必须在onCreate之后排队(尚未阅读Android活动等来源)。因此,尝试发布以后加载布局不起作用。不得不使用AsyncTask。由于AsyncTask有自己的内部处理程序;也许,然后在onCreate之后直接在队列中创建任务,但doInBackgroundonPostExecute可能会在稍后出现,因为它们稍后在队列中。

因此,AsyncTask更适合此UI需要稍后使用setContentView加载过大的布局文件 - 后来意味着onCreate之后可以显示ProgressDialogProgressDialog完成后才会显示onCreate

另外,请参阅此文章了解如何choose when to use AsyncTask。基本上说当想要更新UI时。但实际上你可以使用runOnUIThread执行此操作,因此如果您已经了解Java线程,则不需要处理程序或AsyncTaskrunOnUIThread就像Swing中的invoke / invokeLater一样。