java - 进度对话框未显示在 AsyncTask 中

标签 java android listview android-asynctask dialog

我有一个带有 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 是在适配器的构造函数中传递给适配器的私有(private)字段:

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

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

@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();
}

有谁知道为什么对话框没有出现在我的 Activity 中?

最佳答案

Does anyone know why the dialog is not appearing on my activity?

是的,下面一行代码...

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 变量设置为应有的值。

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

关于java - 进度对话框未显示在 AsyncTask 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26573720/

相关文章:

java - 对预检请求的响应未通过访问控制检查 : No 'Access-Control-Allow-Origin' header is present . 服务器错误

java - BouncycaSTLe RSA key 大小和填充

android - 使用 Dalvik VM 进行快速字符串比较?

android - 搜索包含西里尔数据的 SQLite 数据库

android youtube 应用程序列表淡出边缘

java - 关于企业 Java session Bean

java - CompletableFuture.allOf() 与 anyOf()

Android:FragmentAdapter 和 pageview 不更新 View

android - 更改 recyclerview 适配器中的项目

listview - 如何在 ListView 中拉伸(stretch) ListView 项