2

首先,我已经阅读了所有这些讨论,即手动退出 Android 应用程序不是一个好主意。但就我而言,这似乎是必要的。我有一个AsyncTask在后台进行很多操作的。这意味着下载数据,将其保存到本地存储并准备在应用程序中使用。可能会发生没有互联网连接或发生不同情况的情况。对于所有这些情况,我都有一个返回结果的异常处理。如果出现异常,应用程序将无法使用,因此我需要退出它。我的问题是,当我通过代码退出应用程序时,我是否必须执行一些取消注册卸载或解除绑定任务或其他操作System.exit(0)?我在一个中完成所有这些AsyncTask,请参见我的示例:

public class InitializationTask extends AsyncTask<Void, Void, InitializationResult> {
    private ProcessController processController = new ProcessController();
    private ProgressDialog progressDialog;
    private Activity mainActivity;

    public InitializationTask(Activity 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())  {
            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();

                            //TODO cancel application
                            System.exit(0);
                        }
                    });

            dialog.show();
        }
    }
}
4

2 回答 2

3

好吧,您已经提到关闭 Android 应用程序不是一个好主意。

你真的不应该使用System.exit()!如果您需要它,那么您的应用程序的体系结构存在严重问题。例如,您可以有一个专用于这些“无连接”状态的特殊屏幕。

处理这种“无数据”状态的解决方案可能是通过调用关闭活动(或所有活动)finish(这很好)。在完成一项活动之前,您应该进行清理:取消任务、取消注册接收器等。现在应用程序仍然处于活动状态,但您必须让系统将其杀死。杀死它与Android的工作方式相反。

于 2012-11-11T11:13:08.993 回答
1

虽然从技术上讲,使用System.exit会起作用(操作系统会负责清理进程),但您不应该使用它。

我会重新考虑你正在采取的方法。处理任务中的错误的正确方法是将错误传播到运行任务的活动,在那里可以处理它,然后finish()如果检测到此类错误,则只传播活动。这允许您在应用程序(或最顶层的活动)关闭之前向用户显示一条消息,通知他们错误。

于 2012-11-11T10:57:59.883 回答