我正在启动网络连接的AsyncTask,并决定10秒的超时之后,如果出现网络问题,应取消任务:
final aTask record = new aTask();
record.execute();
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
@Override
public void run() {
if ( record.getStatus() == AsyncTask.Status.RUNNING ) {
record.cancel(true);
Toast.makeText(MainActivity.this, "Error in handling recording: connection timeout", Toast.LENGTH_SHORT).show();
}
}
}, 10000 );
我注意到Spinner对话框总是在异步任务取消后运行。我如何驳回?
更简单的事情是在处理程序代码中添加dialog.disse()
final aTask record = new aTask();
record.execute();
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
@Override
public void run() {
if ( record.getStatus() == AsyncTask.Status.RUNNING ) {
record.cancel(true);
dialog.dismiss(); <----------------- ADDED HERE
Toast.makeText(MainActivity.this, "Error in handling recording: connection timeout", Toast.LENGTH_SHORT).show();
}
}
}, 10000 );
非常感谢大家的帮助
当您取消异步任务时,她不会离开doInBackground。。。
区块报价可以通过调用cancel(布尔值)随时取消任务。调用此方法将导致后续对isCancelled()的调用返回true。调用此方法后,doInBackground(Object[])返回后将调用onCancelled(Object),而不是onPostExecute(Object)。为了确保任务尽快取消,如果可能的话(例如在循环中),您应该始终定期从doInBackground(Object[])检查isCancelled()的返回值
只需偶尔检查一下isCancelled():
protected Object doInBackground(Object... x) {
while (/* condition */) {
// work...
if (isCancelled()) break;
}
return null;
}
全局声明Dialog
,类似
Dialog dlg;
在AsynTask
的onPreExecute
中
dlg = new Dialog(MainActivity.this);
dlg.show();
在doInBackground
中
if(this.isCancelled())
dlg.dismiss();
在AyncTask
的onPostExecute
中进行
handler.postDelayed(new Runnable()
{
@Override
public void run() {
if ( this.getStatus() == AsyncTask.Status.RUNNING ) {
if(dlg.isShowing())
dlg.dismiss();
Toast.makeText(MainActivity.this, "Error in handling recording: connection timeout", Toast.LENGTH_SHORT).show();
}
}
}, 10000 );
或者,如果你只是想在AsynTask
完成任务后关闭对话框,那么在onPostExecute
内部只需使用dlg.dismiss()
信息
来自AsynTask.isCancelled()的文档
如果此任务在正常完成之前被取消,则返回true。如果对任务调用cancel(布尔值),则应定期从doInBackground(Object[])检查此方法返回的值,以尽快结束任务。
有一个全局引用供您使用,如下所示。
Dialog d;
//现在在您的AsyncTask 中
Class MyTask extends AsyncTask{
onPostExecute(){
if(d!=null){
d.dismiss(); // do this to dismiss once task finished
}
}
@Override
protected Object doInBackground(Object... params) {
// TODO Auto-generated method stub
// keep doing this
if(this.isCancelled()){
d.dismiss();
}