代码之家  ›  专栏  ›  技术社区  ›  Steve

处理程序与异步任务

  •  124
  • Steve  · 技术社区  · 15 年前

    我很困惑什么时候会选择asynctask而不是handler。假设我有一些代码,我想运行每N秒,这将更新用户界面。为什么我要选择其中一个?

    9 回复  |  直到 6 年前
        1
  •  72
  •   Samuh    14 年前

    在imo中,asynctask的编写是为了提供一种方便、易用的方式来实现android应用程序的后台处理,而不必太担心底层细节(线程、消息循环等)。它提供了回调方法,帮助安排任务,并在需要时轻松更新ui。

    但是,需要注意的是,当使用asynctask时,开发人员正在服从其限制,这是由于类的作者所做的设计决策造成的。例如,我最近发现,使用asynctasks可以调度的作业数量是有限制的。

    handler在两者中更为透明,可能会给您更多的自由;因此,如果您想要对事物进行更多的控制,您可以选择handler,否则asyntask就可以正常工作。

        2
  •  60
  •   alexanderblom    15 年前

    我的经验法则是:

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

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

        3
  •  17
  •   Community CDub    8 年前

    尽可能避免使用asynctask,主要原因如下:

    • asynctask不能保证运行,因为系统设置了线程池基数和最大大小,如果创建太多asynctask,它们最终将被破坏

    • 异步任务可以自动终止,即使是在运行时,这取决于活动生命周期,并且您无法控制它

    • 在ui线程上运行的asynctask方法,如onpostexecute,可以在它所引用的活动不再可见或可能处于不同的布局状态(如方向更改后)时执行。

    总之,您不应该使用asynctask的uithread链接方法,这是它的主要优点!!!!此外,你应该只在后台做非关键性的工作。 有关此问题的详细信息,请阅读此线程:

    Is AsyncTask really conceptually flawed or am I just missing something?

    最后,如果您担心上述任何问题,请尝试使用intentservices、handlerthread或threadpoolexecutor而不是asynctask。当然这需要更多的工作,但你的应用程序会更安全。

        4
  •  15
  •   沛 晁 MrSnowflake    13 年前

    如果你想每x秒做一次计算,你可能应该安排一个 Runnable 在一 Handler postDelayed() ) 可运行的 应该从当前的ui线程开始。如果要在另一个线程中启动它,请使用handlerThread。 asynctask对我们来说更容易使用,但并不比handler好。

        5
  •  6
  •   secretlm    13 年前

    处理程序与应用程序主线程关联。它处理并调度从后台线程发送到应用程序主线程的消息和可运行文件。

    asynctask提供了一个简单的方法来处理后台线程,以便在更新ui时不被耗时的操作阻塞。

    答案是两者都可以用于从后台线程更新ui,区别在于执行场景。您可以考虑使用handler—如果您希望以特定顺序向消息队列发送延迟的消息或消息。

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

        6
  •  0
  •   saubhagya das    10 年前

    他们是被问到的最好的面试问题。 异步任务 -它们用于卸载ui线程并在后台执行任务。 处理程序 -android dosent在ui和后台线程之间有直接的通信方式。处理程序必须用于通过消息队列发送消息或可运行。

    因此,异步任务用于需要在后台执行任务的地方,处理程序用于ui和后台线程之间的通信。

        7
  •  0
  •   lomza    8 年前

    AsyncTask 假设在一些后台工作完成后,您将在ui线程上执行某些操作。也, 你只能执行一次 (在此之后,其状态为 FINISHED 您将得到一个异常,试图再次执行它)。而且,使用它的灵活性也不高。是的,你可以用 THREAD_POOL_EXECUTOR 对于一个并行的执行,但是这个努力可能是不值得的。

    Handler 除了处理runnable和消息之外,不需要任何假设。而且,它 你想跑多少就跑多少 . 您可以自由决定它必须连接到哪个线程,它如何与其他处理程序通信,或者使用 HandlerThread . 所以,它更灵活,更适合一些重复的工作。

    检查不同类型的 处理器 例子 here .

        8
  •  0
  •   Shinoo Goyal    7 年前

    干背地 -基本上是在另一个线程中工作。 后执行 -在ui线程上发布结果,并在内部向主线程的处理程序发送消息。主ui线程已经有一个与之关联的looper和handler。

    所以,基本上,如果必须执行一些后台任务,请使用asynctask。但最终,如果需要在ui上更新某些内容,它将使用主线程的处理程序。

        9
  •  0
  •   yoAlex5    6 年前

    异步任务=线程+处理程序

    处理程序-这是一种允许处理消息队列的机制。它被限定在有活套的混凝土螺纹上。

    请在这里读更多- https://blog.mindorks.com/android-core-looper-handler-and-handlerthread-bd54d69fe91a