Android 在性能方面,处理程序(MessageQueue)和异步任务(SERIAL_EXECUTOR)之间有什么区别?

Android 在性能方面,处理程序(MessageQueue)和异步任务(SERIAL_EXECUTOR)之间有什么区别?,android,multithreading,android-asynctask,android-handler,Android,Multithreading,Android Asynctask,Android Handler,有几种方法可以在应用程序中异步获取数据。一个是处理程序,另一个是异步任务。现在我已经使用了这两种方法,并且想知道哪一种在某些任务中表现得更好/更有效 因此,我主要使用AsyncTasks获取Web数据,并使用Handler从服务到活动获取数据 我想知道对Webdata使用处理程序,或者使用AsyncTasks从服务刷新UI是否有好处。最大的区别是什么?因为,你的比较是。。。奇怪 AsyncTask非常适合于事务性工作:需要几毫秒以上几分钟的工作。对于这类工作,如果您不需要自己的线程管理,Asyn

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

因此,我主要使用
AsyncTasks
获取Web数据,并使用
Handler
服务
活动
获取数据

我想知道对Webdata使用
处理程序
,或者使用AsyncTasks从
服务
刷新UI是否有好处。最大的区别是什么?

因为,你的比较是。。。奇怪

AsyncTask
非常适合于事务性工作:需要几毫秒以上几分钟的工作。对于这类工作,如果您不需要自己的线程管理,
AsyncTask
通常更易于使用

如果您有一些线程所需的特定特征,而
异步任务
无法轻松处理,或者如果您在不确定的时间段内需要该线程(例如,直到用户按下停止按钮),请使用您自己的线程和其他东西来处理主应用程序线程:一个
处理程序
,或
post()
,或
runOnUiThread()
。“不确定时间段”建议假定您使用的是一个内置线程池——我从不喜欢从您未设置的线程池中绑定线程。

因为,您的比较是。。。奇怪

AsyncTask
非常适合于事务性工作:需要几毫秒以上几分钟的工作。对于这类工作,如果您不需要自己的线程管理,
AsyncTask
通常更易于使用


如果您有一些线程所需的特定特征,而
异步任务
无法轻松处理,或者如果您在不确定的时间段内需要该线程(例如,直到用户按下停止按钮),请使用您自己的线程和其他东西来处理主应用程序线程:一个
处理程序
,或
post()
,或
runOnUiThread()
。“不确定的时间段”建议假定您使用的是一个内置线程池——我从不喜欢将线程从未设置的线程池中绑定出来。

看起来像
异步任务
使用自己的内部处理程序。我的测试是使用处理程序的“post”立即排队。当在
onCreate
中使用时,这可能会有问题,因为其他操作必须在
onCreate
之后排队(尚未阅读有关此的Android活动等源代码)。因此,尝试发布以稍后加载布局不起作用。必须使用
异步任务
。因为
AsyncTask
有自己的内部处理程序;也许,然后创建任务可能会直接在
onCreate
之后的队列中进行,但是
doInBackground
onPostExecute
可能会在队列中稍后进行

因此,
AsyncTask
更适合此UI,需要稍后使用
setContentView
加载过大的布局文件,这意味着在
onCreate
之后可以显示
ProgressDialog
<代码>进度对话框在完成创建后才会显示


另外,请参阅本文了解如何使用。基本上说,当想要更新用户界面。但实际上,您可以使用
runOnUIThread
来实现这一点,因此,如果您已经了解Java线程,就不需要处理程序或
AsyncTask
runOnUIThread
就像Swing中的invoke/invokeLater一样。

看起来像
AsyncTask
使用自己的内部处理程序。我的测试是使用处理程序的“post”立即排队。当在
onCreate
中使用时,这可能会有问题,因为其他操作必须在
onCreate
之后排队(尚未阅读有关此的Android活动等源代码)。因此,尝试发布以稍后加载布局不起作用。必须使用
异步任务
。因为
AsyncTask
有自己的内部处理程序;也许,然后创建任务可能会直接在
onCreate
之后的队列中进行,但是
doInBackground
onPostExecute
可能会在队列中稍后进行

因此,
AsyncTask
更适合此UI,需要稍后使用
setContentView
加载过大的布局文件,这意味着在
onCreate
之后可以显示
ProgressDialog
<代码>进度对话框在完成创建后才会显示

另外,请参阅本文了解如何使用。基本上说,当想要更新用户界面。但实际上,您可以使用
runOnUIThread
来实现这一点,因此,如果您已经了解Java线程,就不需要处理程序或
AsyncTask
runOnUIThread
就像Swing中的invoke/invokeLater一样