我很困惑何时会在Handler上选择AsyncTask.假设我有一些代码,我想每n秒运行一次,这将更新UI.为什么我会选择一个而不是另一个?
Sam*_*muh 75
IMO,AsyncTask的编写是为了提供一种方便,易用的方式来实现Android应用程序中的后台处理,而不必过多担心低级细节(线程,消息循环等).它提供了回调方法,可以帮助您安排任务,并在需要时轻松更新UI.
但是,重要的是要注意,在使用AsyncTask时,开发人员正在提交其限制,这是因为该类作者所做的设计决策.例如,我最近发现使用AsyncTasks可以安排的作业数量有限.
处理程序更加透明,可能会给你更多的自由; 因此,如果你想要对事物进行更多的控制,你会选择Handler,否则AsynTask会正常工作.
ale*_*lom 62
我的经验法则是:
如果您正在执行与UI相关的隔离操作,例如下载数据以显示在列表中,请继续使用AsyncTask.
如果您正在执行多个重复任务,例如下载要下载的多个图像ImageViews(如下载缩略图),请使用任务队列Handler.
typ*_*pha 19
尽可能避免使用AsyncTask主要是出于以下原因:
AsyncTask不能保证运行,因为系统设置了ThreadPool基数和最大大小,如果你创建了太多的asynctask,它们最终会被销毁
即使在运行时,AsyncTask也可以自动终止,具体取决于活动生命周期,您无法控制它
在UI线程上运行的AsyncTask方法,如onPostExecute,可以在它所引用的Activity时执行,不再可见,或者可能处于不同的布局状态,例如在方向更改之后.
总之,你不应该使用AsyncTask的UIThread链接方法,这是它的主要优势!此外,您应该只对doInBackground进行非关键性工作.阅读此主题可获得有关此问题的更多见解:
AsyncTask在概念上是否真的有缺陷,或者我只是缺少某些东西?
最后,当上述任何一个问题引起关注时,尝试更喜欢使用IntentServices,HandlerThread或ThreadPoolExecutor而不是AsyncTask.当然它需要更多的工作,但你的应用程序将更安全.
MrS*_*ake 16
如果你想每x秒做一次计算,你应该安排一个Runnableon Handler(with postDelayed()),那Runnable应该从当前的UI线程开始.如果要在另一个线程中启动它,请使用HandlerThread.AsyncTask对我们来说更容易使用,但并不比处理程序更好.
Handler与应用程序的主线程相关联.它处理和调度从后台线程发送到app主线程的消息和runnable.
AsyncTask提供了一种处理后台线程的简单方法,以便通过耗时的操作来更新UI而不会阻塞它.
答案是两者都可以用于从后台线程更新UI,不同之处在于您的执行场景.您可以考虑使用处理程序来发布延迟消息或按特定顺序将消息发送到MessageQueue.
如果您想以一种简单方便的方式在应用程序主线程和后台线程之间交换参数(从而更新UI),您可以考虑使用AsyncTask.
| 归档时间: |
|
| 查看次数: |
38421 次 |
| 最近记录: |