处理程序与AsyncTask

Ste*_*eve 128 android

我很困惑何时会在Handler上选择AsyncTask.假设我有一些代码,我想每n秒运行一次,这将更新UI.为什么我会选择一个而不是另一个?

Sam*_*muh 75

IMO,AsyncTask的编写是为了提供一种方便,易用的方式来实现Android应用程序中的后台处理,而不必过多担心低级细节(线程,消息循环等).它提供了回调方法,可以帮助您安排任务,并在需要时轻松更新UI.

但是,重要的是要注意,在使用AsyncTask时,开发人员正在提交其限制,这是因为该类作者所做的设计决策.例如,我最近发现使用AsyncTasks可以安排的作业数量有限.

处理程序更加透明,可能会给你更多的自由; 因此,如果你想要对事物进行更多的控制,你会选择Handler,否则AsynTask会正常工作.

  • 从Honeycomb开始,`AsyncTasks`在一个线程上执行,因此不再有并行性.你仍然可以在paralel`Executor`实现上运行它们. (5认同)

ale*_*lom 62

我的经验法则是:

  • 如果您正在执行与UI相关的隔离操作,例如下载数据以显示在列表中,请继续使用AsyncTask.

  • 如果您正在执行多个重复任务,例如下载要下载的多个图像ImageViews(如下载缩略图),请使用任务队列Handler.

  • 两者都不会很快被弃用.永远不会弃用处理程序,因为UI基本上是围绕它构建的. (10认同)

typ*_*pha 19

尽可能避免使用AsyncTask主要是出于以下原因:

  • AsyncTask不能保证运行,因为系统设置了ThreadPool基数和最大大小,如果你创建了太多的asynctask,它们最终会被销毁

  • 即使在运行时,AsyncTask也可以自动终止,具体取决于活动生命周期,您无法控制它

  • 在UI线程上运行的AsyncTask方法,如onPostExecute,可以在它所引用的Activity时执行,不再可见,或者可能处于不同的布局状态,例如在方向更改之后.

总之,你不应该使用AsyncTask的UIThread链接方法,这是它的主要优势!此外,您应该只对doInBackground进行非关键性工作.阅读此主题可获得有关此问题的更多见解:

AsyncTask在概念上是否真的有缺陷,或者我只是缺少某些东西?

最后,当上述任何一个问题引起关注时,尝试更喜欢使用IntentServices,HandlerThread或ThreadPoolExecutor而不是AsyncTask.当然它需要更多的工作,但你的应用程序将更安全.

  • 我很抱歉这么强烈地反对你的观点,但我不能让你的可怜风格影响到机器人.第一点.你不应该运行那么多线程.如果你遇到这个,你的建筑就是foobar.第2点.究竟是怎么回事..好吧,是的,android中的一切都是垃圾收集器的免费游戏......你只会看到如上所述的abserd行为,在一些严格的任务滥用情况下.要点3.管理你的任务,不要粗鲁,这是一种新手技能.您可以在调用onPause时将其杀死,或者相应地正确分离和附加. (6认同)

MrS*_*ake 16

如果你想每x秒做一次计算,你应该安排一个Runnableon Handler(with postDelayed()),那Runnable应该从当前的UI线程开始.如果要在另一个线程中启动它,请使用HandlerThread.AsyncTask对我们来说更容易使用,但并不比处理程序更好.


sec*_*tlm 7

Handler与应用程序的主线程相关联.它处理和调度从后台线程发送到app主线程的消息和runnable.

AsyncTask提供了一种处理后台线程的简单方法,以便通过耗时的操作来更新UI而不会阻塞它.

答案是两者都可以用于从后台线程更新UI,不同之处在于您的执行场景.您可以考虑使用处理程序来发布延迟消息或按特定顺序将消息发送到MessageQueue.

如果您想以一种简单方便的方式在应用程序主线程和后台线程之间交换参数(从而更新UI),您可以考虑使用AsyncTask.

  • 您可以创建自己的与另一个线程关联的处理程序. (3认同)