当我登录我的应用程序时,异步任务开始执行,当正在执行该任务并且我注销应用程序时,该任务仍在运行,并在一段时间后给我结果(虽然我已经注销)。我想问一下,有没有办法取消这项任务,以免它给我结果?
class AsyncClass extends AsyncTask<>{
@Override
protected String doInBackground(Void... params)
{
if(isCancelled())
{
Log.d("isCancelled", iscancelled());
}
//call the webservice
}
}
现在我正在调用
的其他类if(asyncTaskObject!=null){
asyncTaskObject.cancel(true);
asyncTaskObject=null;
}
但永远不会调用iscancelled()
内的日志语句。
答案 0 :(得分:2)
是的,您可以使用cancel(boolean)
取消AsyncTask。您可以创建AsyncTask类的实例并调用
if(task != null && task.equals(AsyncTask.Status.RUNNING))
task.cancel(true);
答案 1 :(得分:1)
是的,有可能。
YourAsyncTask mTask;
if(mTask!=null) mTask.cancel();
由于
答案 2 :(得分:1)
根据此link使用Task.cancel(true);和isCancelled()
private class UpdateLibrary extends AsyncTask<Void, Integer, Boolean>{
private ProgressDialog dialog = new ProgressDialog(Library.this);
private int total = Library.instance.appState.getAvailableText().length;
private int count = 0;
//Used as handler to cancel task if back button is pressed
private AsyncTask<Void, Integer, Boolean> updateTask = null;
@Override
protected void onPreExecute(){
updateTask = this;
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
updateTask.cancel(true);
}
});
dialog.setMessage("Updating Library...");
dialog.setMax(total);
dialog.show();
}
@Override
protected Boolean doInBackground(Void... arg0) {
for (int i = 0; i < appState.getAvailableText().length;i++){
if(isCancelled()){
break;
}
//Do your updating stuff here
}
}
@Override
protected void onProgressUpdate(Integer... progress){
count += progress[0];
dialog.setProgress(count);
}
@Override
protected void onPostExecute(Boolean finished){
dialog.dismiss();
if (finished)
DialogHelper.showMessage(Str.TEXT_UPDATELIBRARY, Str.TEXT_UPDATECOMPLETED, Library.instance);
else {
//Do nothing......
}
}
}
答案 3 :(得分:1)
我前一天遇到同样的问题:)
其他3个对我有用的答案的混合。
首先在字段上声明你的asyncTask:
private MyTaskClass miTask;
如果是活动,则在onCreate / onResume上:
miTask = new MyTaskClass();
然后你可以用任何方法执行它。
miTask.execute();
在onPause / onStop:
miTask.cancel(true);
这只有在doInBackground中检查isCancelled()的情况下才有效,这是我为光标访问做出的一个例子,如果片段被解散,它已经关闭了:
@Override
protected Void doInBackground(Void... params) {
cached = true;
int idIndex = currentCursor.getColumnIndex(Contacts._ID);
int displayNameIndex = currentCursor
.getColumnIndex(Contacts.DISPLAY_NAME);
while (currentCursor.moveToNext()) {
if (isCancelled()) {
break;
}
希望有所帮助。 亚历