我正在运行AsyncTask
并且需要一点时间来加载。在那段时间内,如果我按下按钮然后它没有响应。它仅在几秒钟后响应。那么我怎样才能杀死或暂停或覆盖AsyncTask
回去?或者还有其他方法可以做类似的事情吗?
if (mainContent != null) {
mainContent.post(new Runnable() {
@Override
public void run() {
Bitmap bmp = Utilities.getBitmapFromView(mainContent);
BlurFilter blurFilter = new BlurFilter();
Bitmap blurredBitmap = blurFilter.fastblur(bmp,1,65);
asyncTask = new ConvertViews(blurredBitmap);
asyncTask.execute();
}
});
我的AsyncTask
:
class ConvertViews extends AsyncTask<Void,Void,Void> {
private Bitmap bmp;
public ConvertViews(Bitmap bmp){
this.bmp = bmp;
}
@Override
protected Void doInBackground(Void... params) {
try {
//Thread.sleep(200);
if(mainViewDrawable == null) {
mainViewDrawable = new BitmapDrawable(getResources(), bmp);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
我的onBackPressed()
:
public void onBackPressed() {
super.onBackPressed();
asyncTask.cancel(true);
finish();
}
答案 0 :(得分:2)
你无法阻止asynch task instantly
。每个AsynchTask都有boolean flag property
与之关联,所以如果cancel_flag =True
意味着任务被取消且有cancel()
可以像这样asynchtask object
调用的函数
loginTask.cancel(true);
但所有这个cancel()函数都是这样,它会将asynch任务的取消boolean(flag )
属性设置为True
,因此,您可以使用isCancelled()
函数在{{} doInBackGround
内查看此属性1}}并做一些事情,比如
protected Object doInBackground(Object... x) {
while (/* condition */) {
// work...
if (isCancelled()) break;
}
return null;
}
如果是True,那么您可以使用break the loops
(如果您执行的任务很长)或return
快速退出doInBackground
并致电cancel() on asynchtask
跳过onPostExecute()
。
另一个选项是,如果你想在后台停止多个正在运行的异步任务,那么在每个上面调用cancel都会很乏味,所以在这种情况下你可以在container class(of asynchtask)
中有一个布尔标志并跳过里面的工作asynchtask如果标志已设置为True,如
protected Object doInBackground(Object... x) {
while (/* condition */) {
// work...
if (container_asynch_running_flag) break;
}
return null;
}
但请务必在这种情况下检查onpostExecute
因为它不会停止执行onpost。
答案 1 :(得分:0)
您可以立即停止拨打asyncTask.cancel(true)
。
但不建议这样做,因为它可能导致内存泄漏。最好调用asyncTask.cancel(false)
并退出doInBackground函数,手动检查isCancelled()
值为@Pavneet建议。