我正在尝试重构我的一个活动。我有一个非常大的私有AsyncTask类,我想把它放在一个单独的类中。AsyncTask 本身也应该在完成后更新 UI,因此我必须为该类提供应用程序上下文。
现在,这两种方法中哪一种更好:只需将类创建为任务?
public class MyCustomTask extends AsyncTask
与:
new MyCustomTask().execute();
或者创建一个本身启动任务的 Actitvity,并按意图调用此 Actitivy?
public class MyCustomActivity extends Activity {
onCreate() {
new MyCustomTask().execute();
}
private class MyCustomTask extends AsyncTask<..>();
}
与:
Intent intent = new Intent(this, MyCustomActivity.class);
如果你有一个单独的 AsyncTask 并且需要在 postExecute 上执行 UI 操作,有 3 种方法可以执行它:
-
在您的活动中覆盖它。在子类中仅添加 UI 操作代码。
-
创建一个接口并将其用作侦听器。 看这里
-
将您的活动作为参数传递给 AsyncTask。
对于 2 和 3,您要检查 postExecute() 中的活动是否仍然处于活动状态。
以下是我在活动中执行 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 的常规类。
理由纯粹为了启动AsyncTask
而创建单独的Activity
。只需将其创建为单独的类,并在必要时传入Context
。只要确保你不会泄漏它。
如果AsyncTask
与活动交互,则保持相同,否则创建一个单独的活动。使用 AsyncTask
作为内部类的优点是,此类允许在 UI 线程上执行后台操作和发布结果,而无需操作线程和/或处理程序。