我有一个带有 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();
永远不要使用AsyncTask
的get()
方法。它将阻塞主/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/