您好我的应用程序中有一个异步任务来读取联系人详细信息(这需要一点时间)。它做得很好,但问题是当我在完成之前取消异步任务时,获取详细信息我的应用程序崩溃。当我取消异步任务时,我认为让应用程序退出。我搜索网络并找到一些方法,但它没有用,所以如何在取消异步任务时退出我的应用程序? 我的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();
}
}
答案 0 :(得分:1)
可以随时通过调用AsyncTask
取消cancel(boolean)
。调用此方法将导致后续调用isCancelled()
返回true。调用此方法后,onCancelled(Object)
将在onPostExecute(Object)
返回后调用,而不是doInBackground(Object[])
。 为了确保尽快取消任务,您应该始终从doInBackground(Object [])定期检查isCancelled()的返回值,如果可能的话(例如在循环内)。 < / p>
这是从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()
。 / p>
答案 1 :(得分:0)
我假设您尝试通过调用get()
方法获取结果,该方法在取消任务时抛出异常。如何在尝试检索结果之前检查isCancelled()
?
if(!task.isCancelled()) {
Result result = task.get();
}
此外,您可能会尝试查看onCancelled()
。它在UI线程上运行,并在取消任务时调用。