【问题标题】:Progress Dialog not showing up in AsyncTask进度对话框未显示在 AsyncTask 中
【发布时间】:2014-10-26 13:54:30
【问题描述】:

我有一个带有 AsyncTask 的 Android 应用程序,它负责从 Internet 下载文件。单击 Listview 中的项目时会执行此 AsyncTask。所以我有一个自定义适配器,在 Listview 的 OnItemClickListener 中,我开始下载并执行 AsyncTask。

现在,我的适配器包含以下代码来启动名为​​ FileDownloader 的 AsyncTask:

@Override
public void onClick(View view) {
     try {
         FileDownloader fd = new FileDownloader(activity);
         // some irrelevant code here
         String filepath = fd.execute("http://myurl.com/img.png", PDFFileName, GameHistoryAdapter.this.gameInfo.toString()).get();
     }
     catch(Exception e) { e.printStackTrace(); }
}

Activity是一个私有字段,在适配器的构造函数中传递给适配器:

public GameHistoryAdapter(Activity a, int selectedIndex) {
    this.activity = a;
}

FileDownloader 类包含一个 OnPreExecute 方法,我想在其中显示活动的进度对话框:

@Override
protected void onPreExecute() {
    super.onPreExecute();

    dialog = new ProgressDialog(activity);
    dialog.setMessage("Downloading...");
    dialog.setIndeterminate(true);
    dialog.setCancelable(true);
    dialog.show();
}

但无论我尝试什么,对话框都不会出现。当我在 AsyncTask 的 OnPostExecute 方法中创建警报对话框时,将显示该对话框。

@Override
protected void onPostExecute(String res)
{
    super.onPostExecute(res);
    dialog.hide();

    new AlertDialog.Builder(activity)
            .setTitle(activity.getString(R.string.save_pdf_title_text))
            .setMessage(activity.getString(R.string.save_pdf_text) + PDFFileName)
            .setPositiveButton(activity.getString(R.string.close_text), null)
            .setIcon(android.R.drawable.ic_dialog_info)
            .show();
}

有人知道为什么我的活动中没有出现对话框吗?

【问题讨论】:

  • 在 AsyncTask 的构造函数中初始化对话框。在 onPreExecute 中只写 dialog.show();

标签: java android listview android-asynctask dialog


【解决方案1】:

有人知道为什么我的活动中没有出现对话框吗?

是的,下面这行代码……

String filepath = fd.execute("http://myurl.com/img.png", PDFFileName, GameHistoryAdapter.this.gameInfo.toString()).get();

不要永远使用AsyncTaskget() 方法。它将阻塞主/ UI 线程并使AsyncTask 的整个要点变得多余。换句话说,get() 将其变成了一个同步进程,而不是一个异步进程。

您可以在onPostExecute(...) 中显示对话框的事实仅仅是因为它将在对get() 的阻塞调用返回后被调用。这意味着主/UI线程将不再被冻结(阻塞)并且可以再次进行UI更新。

从您对execute(...) 的调用中删除get(),而只需使用...

fd.execute("http://myurl.com/img.png", PDFFileName, GameHistoryAdapter.this.gameInfo.toString());

...然后在您的 onPostExecute(...) 方法中将您的 filepath 变量设置为应有的值。

我不知道是谁在AsyncTask 中添加了get() 方法,但如果我找到它们,我会有一些严肃的话要说。它几乎没有用处,而且会给很多人带来很多困惑。

【讨论】:

  • 很好的答案!删除 get 方法对我有用。我不知道 get 使请求同步,所以这解释了很多。在 AsyncTask 中加入 get 方法确实很奇怪。
  • @Devos50 :是的,我在 Stack Overflow 上看到过很多像你这样的问题,但我从来没有为 get() 方法找到真正好的用途。我希望他们会弃用它,甚至更好地让它过时并完全删除它。无论如何,很高兴能提供帮助。
  • 确实有效,但我在很多情况下AsyncTaskget()不可避免的。例如:我需要显示ProgressDialog直到所有网络下载完成,然后关闭它并继续刷新 UI。下载时间未知,所以我不能使用get(time) 变体。简而言之,用户界面必须等待,而这样做的唯一方法似乎是使用get()。有(更简单的)替代方案吗?
  • 顺便说一句 - 我也无法在 AsyncTask 中显示 ProgressDialog,例如 Devos50。我明白为什么,但遗憾的是,get() 似乎是唯一将我的应用程序结合在一起的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多