gpt4 book ai didi

android - 一遍又一遍地点击主页按钮时,AsyncTask 失步了

转载 作者:行者123 更新时间:2023-11-29 21:55:07 27 4
gpt4 key购买 nike

我有一个执行大量 JSON 计算的 AsyncTask。

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 在后台运行。当我再次从 Android 设备重新启动应用程序时在 AsyncTask 完成后,应用程序仍然有效。
但是应用程序无法处理这个用例:当我部署应用程序时(或在没有数据初始化时启动它),因此初始化数据实际上需要大约 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。我应该以某种方式避免启动应用程序两次还是什么?我不确定我对此有什么选择?有什么想法吗?

最佳答案

我通常会更直白一点。当我不使用它时,我将我的 AsyncTask 引用设置为 null。当 onClick 触发时,我检查它是否不为空,这意味着我启动了它。如果它为空,我就在那里创建并执行一个新的 AsyncTask。它足够快而且足够干净。这种方法的一个好处是 AsyncTask 无论如何只能执行一次,因此它非常适合这一点。在 onPostExecute 结束时,如果您打算留在同一个 Activity 中,您可以再次将引用设置回 null

当您完善 AsyncTask 流程时,请确保它 survives orientation changes

关于android - 一遍又一遍地点击主页按钮时,AsyncTask 失步了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13424556/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com