我有一个带有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();
}
有谁知道为什么对话框没有出现在我的活动中?
答案 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()
,但如果我找到它们,我会说一些严肃的话。它很少或根本没有用,导致很多人混淆不清。