1

我正在尝试重构我的一项活动。我有一个非常大的私有 AsyncTask 类,我想把它放在一个单独的类中。AsyncTask 本身也应该在完成后更新 UI,因此我必须为该类提供应用程序上下文。

现在这两种方法中哪一种更好:只是将类创建为任务?

public class MyCustomTask extends AsyncTask

用于:

 new MyCustomTask().execute();

或者创建一个自身启动任务的 Activity,并按 Intent 调用这个 Activitiy?

public class MyCustomActivity extends Activity {
  onCreate() {
    new MyCustomTask().execute();
  }

  private class MyCustomTask extends AsyncTask<..>();
}

用于:

Intent intent = new Intent(this, MyCustomActivity.class);
4

4 回答 4

3

如果你有一个单独的 AsyncTask 并且需要在 postExecute 上做 UI 操作,有 3 种方式来执行它:

  1. 在您的活动中覆盖它。在子类中只添加 UI 操作代码。

  2. 创建一个接口并将其用作侦听器。看 这里

  3. 将您的活动作为参数传递给 AsyncTask。看这里

对于 2 和 3,您要检查 Activity 在 postExecute() 中是否仍然存在。

于 2012-05-30T17:28:02.480 回答
2

以下是我在我的活动中执行 ASyncTask 的方法:

public class MyClass extends Activity {

     @Override
     public void onClick(View v) {
          MyNewThread thread = new MyNewThread();
          thread.execute();
     }

     private class MyNewThread extends ASyncTask<Void, Void, Void> {
          //Code goes here
     }

}

非常伪代码,但你明白了,它只是活动的内部私有类。现在,如果这个确切的线程是您将在多个活动中运行的东西,那么将它设为自己的类可能是值得的。但是,如果您只是在这里执行此操作,则此实现很好。不管怎样,不要让它成为一个活动,它只是一个扩展 ASyncTask 的常规类。

于 2012-05-30T17:26:11.050 回答
1

没有理由单独创建一个Activity纯粹来启动AsyncTask. 只需将其创建为一个单独的类,并在Context必要时传入一个。只要确保你不泄漏它。

于 2012-05-30T17:16:49.517 回答
1

如果与 Activity 交互,则保持不变AsyncTask,否则创建一个单独的。用作内部类的优点AsyncTask是此类允许执行后台操作并在 UI 线程上发布结果,而无需操作线程和/或处理程序。

于 2012-05-30T17:39:35.973 回答