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/

相关文章:

android - 在 arrayadapter 中更新数据后 ListView 回到顶部位置

java - "spark.memory.fraction"好像没有作用

没有刷新startactivity的Android ListView 更新

java - 有关 SWT 变量声明顺序的问题

java - 将简单的 json 解析为微调器条目

android - 为什么 ViewPager 高度 match_parent 不起作用?

Android 导航 Controller 错误 `no current navigation code`

java - 如何更改android studio中的整个背景

java - Java中如何查找未关闭的I/O资源?

java - 如何在代码中安全地存储私钥