我在这里寻找答案,但找不到我需要的东西。以下是我正在处理的场景:我有一个AsyncTask进行Web服务调用:
class getDataDetailTask extends AsyncTask<String, Void, DataDetail> {
@Override
protected DataDetail doInBackground(String... args) {
return AppUtils.getDataDetails();
}
@Override
protected void onCancelled(OutageDetail result) {
.... // something goes here
}
}
因此,假设webservice调用通常会在30秒后超时(如果不成功)。现在,我不希望用户等待30秒才能发现呼叫已经超时,我希望它不会超过10秒。所以我创建了一个计时器来管理AsyncTask:
class checkDataTask implements Runnable {
getDataDetailTask dataAsyncTask;
Context context;
public checkDataTask(getDataDetailTask asyncTask) {
dataAsyncTask = asyncTask;
}
@Override
public void run() {
mHandler.postDelayed(runnable, 10);
}
Handler mHandler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
if (dataAsyncTask.getStatus() == Status.RUNNING
|| dataAsyncTask.getStatus() == Status.PENDING) {
dataAsyncTask.cancel(true);
}
}
};
}
所有这些调用都是在Activity中的onCreate方法中设置的,如下所示:
getDataDetailTask dataTask = new getDataDetailTask();
dataTask.execute();
checkDataTask check = new checkDataTask(dataTask);
(new Thread(check)).start();
当AsyncTask发出cancel(true)方法时,正在调用onCancelled(Object)或[onCancelled()以获取早期的SDK版本)。我的问题是,在我的onCancelled电话中我应该怎么做才能“杀死”这个任务?
答案 0 :(得分:0)
只需设置处理程序,即可在给定的时间段后取消AsyncTask
:
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
@Override
public void run() {
if ( check.getStatus() == AsyncTask.Status.RUNNING )
check.cancel(true);
}
}, 10000 );