【问题标题】:Android AsyncTask best practice / design paterns?Android AsyncTask 最佳实践/设计模式?
【发布时间】:2014-08-02 22:14:24
【问题描述】:

我不是经验丰富的安卓开发者,但我是一名程序员。我想获得一些关于如何在 android 中使用 AsyncTasks 的建议。我知道如何实现它们,但困扰我的是,如果我想让结果对 UI 可见,我必须从 AsyncTask 对 UI 进行更改。 我不喜欢这样,因为我或多或少地将 AsyncTask 想象成一个用于获取数据或进行一些计算的线程。我尝试实现对 Activity 的回调,然后更改 UI。但我不确定这是否是一个好习惯。

Google 文档说:“AsyncTask 允许正确且轻松地使用 UI 线程。此类允许执行后台操作并在 UI 线程上发布结果,而无需操作线程和/或处理程序。”

简而言之,我不喜欢 AsyncTaks 更改 UI。我将 AsyncTask 视为获取数据的东西,并将 Activites 视为与 UI 交互的“控制器”。有什么好的模式可以使用 AsyncTasks 吗?或者更具体地说,可以在 onPostExecute 中对主 UI 线程进行回调吗?

【问题讨论】:

  • 我知道这不是你问的,但我强烈建议不要使用 AsyncTask。为什么?因为它与您的活动/片段严重耦合。这意味着,如果您的活动/片段更改它的状态(暂停,销毁),即使您没有收到结果,您的异步任务也会被破坏。一个解法?我建议使用 EventBus(如 Otto 或 GreenDao 的 Event Bus)
  • @LeonardoFerrari:AsyncTask 不会在配置更改时被破坏,甚至不会通过 BACK 按钮破坏活动。
  • “困扰我的是,如果我想让结果对 UI 可见,我必须从 AsyncTask 对 UI 进行更改”——不,你不需要。唯一的要求是您必须从 主应用程序线程 更新 UI。 AsyncTaskdoInBackground() 方法很可能会触发 UI 更新。如何准确地完成 UI 更新取决于您。 “有什么好的模式可以使用 AsyncTasks 吗?” -- 有很多和其他模式不使用AsyncTask。不过,您需要先解释具体问题,因为并非所有模式都适用于所有情况。
  • 我最后添加了关于回调到主 UI 线程的更具体的问题。

标签: android android-asynctask


【解决方案1】:

您为自己提供了 AsyncTask 的最佳实践说明:

“AsyncTask 允许正确且轻松地使用 UI 线程。此类允许执行后台操作并在 UI 线程上发布结果,而无需操作线程和/或处理程序。”

要了解 AsyncTask 为何以及如何作为后台进程运行,同时有可能与 UI 线程通信,让我们看一下这个示例:

new AsyncTask<Void, Void, Void>() {

        @Override
        protected void onPreExecute() {
             // Callback executed on UI thread right before starting the background process.
        }

        @Override
        protected  Void doInBackground(Void... params) {
            // Background process execution.
        }

        @Override
        protected void onPostExecute(Void args) {
            // Callback executed on UI thread right after finishing the background process.
        }
    }.execute();

正如 google 所解释的,使用 this 而不是自定义线程/任务,消除了必须委托处理程序并为 UI 线程交互构建自定义回调的必要性。

在 Android 中,由于大多数情况下您需要后台进程,是因为您希望将其结果交付/操作到 Activity(在 UI 线程上运行),AsyncTask 在进程之前和之后提供了这种相互通信,可以为任何回调参数化数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多