在您的应用中,有几种方法可以异步获取数据。一个是Handler
,另一个是AsyncTask
。现在我已经使用了两者,并且想知道哪一个在某些任务中表现更好/更有效。
因此,我主要使用AsyncTasks
获取Webdata,Handler
获取从Services
到Activities
的数据。
我想知道将Handler
用于Webdata或使用AsyncTasks从Services
刷新UI是否有优势。有什么大不同?
答案 0 :(得分:4)
自AsyncTask
uses a Handler
以来,您的比较是......奇怪的。
AsyncTask
非常适合交易工作:需要花费超过几毫秒且不到几分钟的内容。对于这类工作,如果您不需要自己的线程管理,AsyncTask
通常更易于使用。
如果您的线程需要一些AsyncTask
无法轻易处理的特性,或者您需要线程一段不确定的时间(例如,直到用户按下“停止”按钮),使用您自己的线程和其他东西来完成主应用程序线程的工作:Handler
,post()
或runOnUiThread()
。 “不确定的时间段”建议假设您正在使用其中一个内置线程池 - 我从来不会将线程从您未设置的线程池中占用。
答案 1 :(得分:1)
看起来AsyncTask
使用自己的内部处理程序。我的测试是使用Handler的“帖子”立即排队。在onCreate
中使用时,这可能会有问题,因为其他操作必须在onCreate
之后排队(尚未阅读Android活动等来源)。因此,尝试发布以后加载布局不起作用。不得不使用AsyncTask
。由于AsyncTask
有自己的内部处理程序;也许,然后在onCreate
之后直接在队列中创建任务,但doInBackground
和onPostExecute
可能会在稍后出现,因为它们稍后在队列中。
因此,AsyncTask
更适合此UI需要稍后使用setContentView
加载过大的布局文件 - 后来意味着onCreate
之后可以显示ProgressDialog
。 ProgressDialog
完成后才会显示onCreate
。
另外,请参阅此文章了解如何choose when to use AsyncTask。基本上说当想要更新UI时。但实际上你可以使用runOnUIThread
执行此操作,因此如果您已经了解Java线程,则不需要处理程序或AsyncTask
。 runOnUIThread
就像Swing中的invoke / invokeLater一样。