首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对话框在AsyncTask超时时关闭

对话框在AsyncTask超时时关闭
EN

Stack Overflow用户
提问于 2014-09-11 10:07:51
回答 4查看 855关注 0票数 1

我正在为网络连接启动AsyncTask,在此之后,我决定了10秒超时,任务应该被取消,以防网络问题

代码语言:javascript
运行
复制
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 );

我注意到自旋器对话框总是在异步任务被取消后运行。我怎么能拒绝呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-09-11 13:42:55

更简单的方法是在Handler代码中添加dialog.dismiss():

代码语言:javascript
运行
复制
        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 );

非常感谢大家的帮助

票数 2
EN

Stack Overflow用户

发布于 2014-09-11 10:16:18

当你取消一个同步任务时,她不会离开doInBackground.

可以通过调用cancel(布尔值)在任何时候取消任务。调用此方法将导致后续对isCancelled()的调用返回true。调用此方法后,将在onCancelled(Object[])返回后调用doInBackground(Object),而不是onPostExecute(Object)。为了确保任务被尽快取消,您应该始终定期检查isCancelled()从doInBackground(Object[])返回的值(如果可能的话)(例如在循环中)。

只需偶尔检查一下isCancelled():

代码语言:javascript
运行
复制
 protected Object doInBackground(Object... x) {
    while (/* condition */) {
      // work...
      if (isCancelled()) break;
    }
    return null;
 }
票数 1
EN

Stack Overflow用户

发布于 2014-09-11 10:33:28

全局声明一个Dialog,类似于

代码语言:javascript
运行
复制
Dialog dlg;

onPreExecute of your AsynTask

代码语言:javascript
运行
复制
dlg = new Dialog(MainActivity.this);
dlg.show();

doInBackground

代码语言:javascript
运行
复制
if(this.isCancelled())
dlg.dismiss();

onPostExecute of your AyncTask中这样做

代码语言:javascript
运行
复制
 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[])检查此方法返回的值,以尽快结束任务。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25784649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档