1

こんにちは私のアプリには連絡先の詳細を読み取るための非同期タスクがあります(これには少し時間がかかります)。それはうまくいきますが、完了する前に非同期タスクをキャンセルすると、アプリがクラッシュする詳細を取得するときに問題が発生します。非同期タスクをキャンセルしたときにアプリを終了させると考えていました。Webを検索していくつかの方法を見つけましたが、機能しませんでした。非同期タスクをキャンセルしたときにアプリを終了するにはどうすればよいですか? 私のAsynタスクコード(通常のコード)

public class FetchingContact extends AsyncTask<String, Void, Void> {
    private final ProgressDialog dialog = new ProgressDialog(
            MobiMailActivity.this);

    // can use UI thread here
    protected void onPreExecute() {
        this.dialog.setMessage("Fetching Contact...");
        this.dialog.show();
    }

    // automatically done on worker thread (separate from UI thread)
    protected Void doInBackground(final String... args) {
        readContact();
        if (isCancelled ()) {

            finish();
        }

        return null;
    }

    // can use UI thread here
    protected void onPostExecute(final Void unused) {
        if (this.dialog.isShowing()) {
            this.dialog.dismiss();
            CharSequence test=sam;
            //  search_sort.setText(test);
                check(test);


        }
        // reset the output view by retrieving the new data
        // (note, this is a naive example, in the real world it might make
        // sense
        // to have a cache of the data and just append to what is already
        // there, or such
        // in order to cut down on expensive database operations)
        // new SelectDataTask().execute();
    }

}
4

2 に答える 2

1

AAsyncTaskは、を呼び出すことでいつでもキャンセルできますcancel(boolean)。このメソッドを呼び出すと、後続の呼び出しでisCancelled()trueが返されます。このメソッドを呼び出した後onCancelled(Object)、ではなく、onPostExecute(Object)が戻り後に呼び出されdoInBackground(Object[])ます。タスクができるだけ早くキャンセルされるようにするには、可能であれば、doInBackground(Object [])からisCancelled()の戻り値を定期的にチェックする必要があります(たとえば、ループ内)。

これは文字通りAsyncTaskから引用されています。しかし、コード全体をreadContact()というメソッドに入れているので、これを行うことはできません。

あなたができることはこれです:

protected void onPostExecute(final Void unused) {
    if (this.dialog.isShowing()) {
        this.dialog.dismiss();
        (if !isCancelled()) {
            CharSequence test=sam;
        //  search_sort.setText(test);
            check(test);
        }
    }
}

したがって、AsyncTaskの最後に、何かを行う必要があるかどうかを確認します。これはそれを行う方法ではないので、メソッドを取得readContact()して完全にAsyncTaskに配置するか、AsyncTask内のメソッドでisCancelled()ある場合は、そこでcheckを呼び出すことをお勧めします。

于 2012-08-20T10:50:54.583 に答える
0
  1. get()タスクがキャンセルされたときに例外をスローするメソッドを呼び出して結果を取得しようとするとします。isCancelled()結果を取得する前に確認してみてはどうでしょうか。

    if(!task.isCancelled()) { Result result = task.get(); }

  2. また、チェックアウトしてみてくださいonCancelled()。これは UI スレッドで実行され、タスクがキャンセルされたときに呼び出されます。

于 2012-08-20T10:52:28.030 に答える