1

嗨,在我的应用程序中有一个异步任务来读取联系人详细信息(这需要一点时间)。它做得很好,但是当我在完成之前取消异步任务时,问题是什么,获取详细信息我的应用程序崩溃了。所以我我认为当我取消异步任务时会使应用程序退出。我在网上搜索并找到了一些方法但它没有用,那么在取消异步任务时如何退出我的应用程序? 我的 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), 而不是。为了确保尽快取消任务,如果可能(例如在循环内),您应该始终从 doInBackground(Object[]) 定期检查 isCancelled() 的返回值。onPostExecute(Object)doInBackground(Object[])

这是从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 in。

于 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 回答