我有一个 AsyncTask 可以进行大量 JSON 计算。
public class InitializationTask extends AsyncTask<Void, Void, InitializationResult> {
private ProcessController processController = new ProcessController();
private ProgressDialog progressDialog;
private MainActivity mainActivity;
public InitializationTask(MainActivity mainActivity) {
this.mainActivity = mainActivity;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = new ProgressDialog(mainActivity);
progressDialog.setMessage("Die Daten werden aufbereitet.\nBitte warten...");
progressDialog.setIndeterminate(true); //means that the "loading amount" is not measured.
progressDialog.setCancelable(false);
progressDialog.show();
};
@Override
protected InitializationResult doInBackground(Void... params) {
return processController.initializeData();
}
@Override
protected void onPostExecute(InitializationResult result) {
super.onPostExecute(result);
progressDialog.dismiss();
if (result.isValid()) {
mainActivity.finalizeSetup();
}
else {
AlertDialog.Builder dialog = new AlertDialog.Builder(mainActivity);
dialog.setTitle("Initialisierungsfehler");
dialog.setMessage(result.getReason());
dialog.setPositiveButton("Ok",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
mainActivity.finish();
}
});
dialog.show();
}
}
}
processController.initializeData() 运行大约 20 秒。这一切都有效。它甚至可以在我安装应用程序并在应用程序初始化时按主页按钮时工作。AsyncTask 在后台工作。当我在 AsyncTask 完成后再次从 Android 设备重新启动应用程序时,应用程序仍然可以工作。
但是应用程序无法处理这种用例:当我部署应用程序时(或在没有数据初始化时启动它),因此初始化数据确实需要大约 20 秒,而当我在初始化时回家关闭应用程序时(AsyncTask ) 在后台运行并再次启动应用程序,它会导致 RuntimExceptions 等意外行为。设备似乎要加载应用程序两次,但都无法成功启动。如何处理?
我考虑过检查 MainActivity 中是否有正在运行的 AsyncTask 以避免再次启动它:
private InitializationTask initializationTask = new InitializationTask(this);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
if (!AsyncTask.Status.RUNNING.equals(initializationTask.getStatus())) {
initializationTask.execute((Void[])null);
}
initializeMap();
}
不幸的是,这并没有做任何事情。此外,我不确定这样的用例是否可行,因为当我两次启动同一个应用程序时,它们无法“共享”AsyncTask。我应该以某种方式避免两次启动应用程序吗?我不确定我有什么选择?有任何想法吗?