我创建了一个简单的AsyncTask,如果需要超过3秒,我想要取消它。这是我在关注this post之后所做的事情:
异步来电:
execTask = new StartParseDownload();
execTask.execute();
//new StartParseDownload(this).execute();
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
@Override
public void run() {
if ( execTask.getStatus() == AsyncTask.Status.RUNNING )
execTask.cancel(true);
}
}, 300 );
任务:
public class StartParseDownload extends AsyncTask<String, Void, Boolean> {
private ProgressDialog dialog;
private boolean result = false;
public StartParseDownload() {
}
protected void onPreExecute(){
}
@Override
protected void onPostExecute(final Boolean success){
super.onPostExecute(success);
}
@Override
protected void onCancelled() {
Log.e("Task cancelled", "Task cancelled");
}
protected Boolean doInBackground(final String... args){
parObj.saveInBackground(new SaveCallback() {
@Override
public void done(com.parse.ParseException e){
if (e == null) {
result = true;
goIntoMainScreen();
} else {
result = false;
}
if (e != null) {
}
}
});
return false;
}
}
我哪里错了?为什么onCancelled()
没有被调用?
答案 0 :(得分:0)
1.你的价值是300,而不是3000(3秒)
2.也可以查看:
if ( execTask.getStatus() == AsyncTask.Status.RUNNING ){
boolean s = execTask.cancel(true);
Log.e("Taskcancelled", "Task cancelled " +s);
}else{
Log.e("Taskcancelled", "Task cancelled already");
}
在致电取消之前,您的任务可能已经完成。
答案 1 :(得分:0)
在doinbackground中,您必须检查AsyncTask是否被取消。 您调用cancel但AsyncTask将继续运行,如果它仍处于dounbackground状态。完成后,onCancel被调用。也许在你的情况下它不会在3秒后被调用,因为你的doinbacground方法需要超过3秒......或者更快!
顺便说一下,我认为你的意思是运行3000而不是300的处理程序
答案 2 :(得分:0)
This回答可能会有所帮助。
文档说明了两种变体:
在API级别11中添加:
protected void onCancelled(结果结果)
在API级别11中添加 在cancel(boolean)之后在UI线程上运行 invoked和doInBackground(Object [])已经完成。
默认实现只是调用onCancelled()并忽略 结果。如果您编写自己的实现,请不要调用 super.onCancelled(结果)。
在API级别3中添加:
protected void onCancelled()
在API级别3中添加 应用程序应优先覆盖 onCancelled(对象)。默认情况下会调用此方法 onCancelled(Object)的实现。
在调用cancel(boolean)之后在UI线程上运行 doInBackground(Object [])已经完成。
我还没有对此进行过测试,但您可能希望尝试实施这两个覆盖:
@Override
protected void onCancelled() {
Log.e("Task cancelled", "Task cancelled");
}
@Override
protected void onCancelled(Boolean result) {
Log.e("Task cancelled", "Task cancelled, result: " + result);
}
记录cancel()
的结果也可能有助于确保您成功取消AsyncTask。
if ( execTask.getStatus() == AsyncTask.Status.RUNNING ){
boolean cancelled = execTask.cancel(true);
if (cancelled){
Log.d("cancel", "Task cancelled");
}
else{
Log.e("cancel", "Task not cancelled");
}
}