我正在为网络连接启动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 );我注意到自旋器对话框总是在异步任务被取消后运行。我怎么能拒绝呢?
发布于 2014-09-11 13:42:55
更简单的方法是在Handler代码中添加dialog.dismiss():
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 );非常感谢大家的帮助
发布于 2014-09-11 10:16:18
当你取消一个同步任务时,她不会离开doInBackground.
可以通过调用cancel(布尔值)在任何时候取消任务。调用此方法将导致后续对isCancelled()的调用返回true。调用此方法后,将在onCancelled(Object[])返回后调用doInBackground(Object),而不是onPostExecute(Object)。为了确保任务被尽快取消,您应该始终定期检查isCancelled()从doInBackground(Object[])返回的值(如果可能的话)(例如在循环中)。
只需偶尔检查一下isCancelled():
protected Object doInBackground(Object... x) {
while (/* condition */) {
// work...
if (isCancelled()) break;
}
return null;
}发布于 2014-09-11 10:33:28
全局声明一个Dialog,类似于
Dialog dlg;在onPreExecute of your AsynTask中
dlg = new Dialog(MainActivity.this);
dlg.show();在doInBackground中
if(this.isCancelled())
dlg.dismiss();在onPostExecute of your AyncTask中这样做
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[])检查此方法返回的值,以尽快结束任务。
https://stackoverflow.com/questions/25784649
复制相似问题