【问题标题】:AsyncTask in a simple class or in Activity?AsyncTask 在一个简单的类中还是在 Activity 中?
【发布时间】:2012-05-30 17:11:17
【问题描述】:

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

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

public class MyCustomTask extends AsyncTask

用于:

 new MyCustomTask().execute();

或者创建一个自己启动任务的 Activity,然后按 Intent 调用这个 Activitvy?

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

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

用于:

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

【问题讨论】:

标签: java android android-asynctask android-activity


【解决方案1】:

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

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

  2. 创建一个接口并将其用作侦听器。见here

  3. 将您的活动作为参数传递给 AsyncTask。见here

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

【讨论】:

    【解决方案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 的常规类。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-23
          • 1970-01-01
          • 2020-01-24
          • 1970-01-01
          相关资源
          最近更新 更多