优雅的解决方案
嘿,人们。 我正在研究一个项目,我正在考虑一个优雅的实施解决方案,我已经厌倦了即兴的解决方案。让我试着向你解释我的“问题”:
我的应用程序的这一部分的任务非常简单:
我希望我的应用程序下载一些内容并在后台处理下载的文件,同时显示ProgressDialog。之后,应该在一些ListActivity中显示的字符串列表中返回内容。到目前为止,没什么大不了的:
Downloader和处理内容是一个子类AsyncTask,并在一个与主Activity不同的类中调用。但现在我的问题是:
在哪里调用Progressdialog? GUI-Thread如何与ProgressDialog“做出反应”?我应该从处理类调用ProgressDialog还是更好地“阻止”主类,等待通知?
问候
EnflamedSoul
答案 0 :(得分:2)
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
此示例取自official Android SDK documentation。使用publishProgress
的优点是您可以传递多个值,具体取决于传入doInBackground的参数数量(即,如果您下载的文件超过1个)。
答案 1 :(得分:0)
将进度对话框定义为全局变量。
ProgressDialog pd;
你要在哪里开启asyncTask:
showYourProgressDialog;
thread = new aThread().execute();
在你班上:
public class aThread extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... args) {
try {
//Do your downloading and stuff
asyncHandler.sendMessage(asyncHandler.obtainMessage(0));
} catch (Exception e) {
Log.e("1", "Error", e);
}
return null;
}
}
Handler asyncHandler = new Handler() {
public void handleMessage(Message msg) {
pd.dismiss();
if (msg.what == 0) {
//update what you need to
}
}
};