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も機能しますが (OS がプロセスのクリーンアップを処理します)、使用しないでください。

あなたがとっているアプローチを再考します。タスクのエラーを処理する適切な方法は、エラーを処理できるタスクを実行しているアクティビティにエラーを伝達し、そのfinish()ようなエラーが検出された場合はアクティビティだけに伝達することです。これにより、アプリ (または最上位のアクティビティ) が閉じる前に、ユーザーにエラーを通知するメッセージを表示できます。

于 2012-11-11T10:57:59.883 に答える