有几种方法可以在您的应用程序中异步获取数据。一个是a Handler
,另一个是a AsyncTask
。现在我已经使用了两者,并且想知道哪一个在某些任务中表现更好/更有效。
到目前为止,我主要用于AsyncTasks
获取 Web 数据,以及Handler
从 获取数据Services
到Activities
.
我想知道将Handler
's 用于 Webdata 或使用 AsyncTasks 从Services
. 最大的区别是什么?
有几种方法可以在您的应用程序中异步获取数据。一个是a Handler
,另一个是a AsyncTask
。现在我已经使用了两者,并且想知道哪一个在某些任务中表现更好/更有效。
到目前为止,我主要用于AsyncTasks
获取 Web 数据,以及Handler
从 获取数据Services
到Activities
.
我想知道将Handler
's 用于 Webdata 或使用 AsyncTasks 从Services
. 最大的区别是什么?
由于AsyncTask
使用 aHandler
,您的比较是......奇怪。
AsyncTask
非常适合事务性工作:需要多于几毫秒且少于几分钟的工作。对于这类工作,如果您不需要自己的线程管理,AsyncTask
通常使用起来更简单。
如果您的线程需要一些特殊的特性,AsyncTask
并且不容易处理,或者如果您需要线程的时间不确定(例如,直到用户按下停止按钮),请使用您自己的线程和其他东西来让主应用程序线程工作: a Handler
, or post()
, or runOnUiThread()
。“不确定的时间段”建议假设您使用的是内置线程池之一——我从不喜欢从您未设置的线程池中绑定线程。
看起来像AsyncTask
使用它自己的内部处理程序。我的测试是使用处理程序的“帖子”立即入队。在onCreate
此使用时可能会出现问题,因为必须在之后将其他操作排入队列onCreate
(尚未通读 Android Activity 等源代码)。因此,尝试发布以稍后加载布局不起作用。不得不使用一个AsyncTask
. 由于AsyncTask
有自己的内部Handler;也许,然后创建任务可能会直接发生在队列中,onCreate
但doInBackground
andonPostExecute
可能会稍后发生,因为它们稍后会出现在队列中。
所以,AsyncTask
这个 UI 工作得更好,需要稍后加载一个过大的布局文件setContentView
- 稍后意味着可以显示onCreate
之后。在完成之前不会出现。ProgressDialog
ProgressDialog
onCreate
此外,请参阅本文了解如何选择何时使用 AsyncTask。基本上是在想要更新 UI 时说。但实际上你可以这样做,runOnUIThread
所以不需要处理程序,也不AsyncTask
需要你已经知道 Java 线程。runOnUIThread
就像 Swing 中的 invoke/invokeLater 一样。