1

我有一个 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。我应该以某种方式避免两次启动应用程序吗?我不确定我有什么选择?有任何想法吗?

4

2 回答 2

1

我通常会更直言不讳地这样做。AsyncTask当我不使用它时,我将引用设置为 null。当onClick火灾发生时,我检查它是否不为空,这意味着我启动了它。如果它为空,我会在AsyncTask那里创建并执行一个新的。它速度很快,而且足够干净。这种方法的一个好处是 anAsyncTask 无论如何只能执行一次,因此它非常适合。最后,如果您打算保持不变onPostExecute,您可以再次将引用设置回。nullActivity

在完善 AsyncTask 流程时,请确保它也能在方向更改后继续存在

于 2012-11-18T14:04:13.480 回答
1

我找到了解决方案:这实际上不是 AsyncTask 问题。问题是我在 processController.initializeData() 中调用的 JSONParser 解析方法(完成大部分工作)没有同步。

于 2012-11-18T17:40:30.417 回答