进度对话框未显示在AsyncTask中

时间:2014-10-26 13:54:30

标签: java android listview android-asynctask dialog

我有一个带有AsyncTask的Android应用程序,它负责从互联网上下载文件。单击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();
}

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

1 个答案:

答案 0 :(得分:2)

  

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

是的,以下代码行......

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

不要 EVER 使用get()的{​​{1}}方法。它将阻塞主/ UI线程,并使AsyncTask的整个点冗余。换句话说,AsyncTask将其转换为同步过程而不是异步过程。

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

从您对get()的通话中移除get(),而只是使用...

execute(...)

...然后在您的fd.execute("http://myurl.com/img.png", PDFFileName, GameHistoryAdapter.this.gameInfo.toString()); 方法中将onPostExecute(...)变量设置为它应该是什么。

我不知道是谁将filepath方法添加到get(),但如果我找到它们,我会说一些严肃的话。它很少或根本没有用,导致很多人混淆不清。