Android ProgressDialog与监听器一起设置旋转屏幕上的进度崩溃
我有一个类来管理文件下载/上传到云上的远程服务。此类实现了一个侦听器,该侦听器在操作完成时发出通知(完成文件上载/下载或上载/下载一组文件) 创建了一个ProgressDialog来显示操作的进度。当下载/上载管理器调用侦听器时,将填充进度栏 当用户转动屏幕时,问题就出现了。在这种情况下,我可以保存进度条的当前状态,但如何保持对上载/下载侦听器的引用 编辑:当用户打开屏幕时,进度条消失,因为活动中的UI被重新加载。下载/上载过程正常继续,直到完成并调用方法“progressBar.Disclose()”。然后出现了一个例外,因为进度条已经不存在了 解决方案:按照此步骤获得使用片段的解决方案 UploadDownloadListener.javaAndroid ProgressDialog与监听器一起设置旋转屏幕上的进度崩溃,android,listener,progressdialog,Android,Listener,Progressdialog,我有一个类来管理文件下载/上传到云上的远程服务。此类实现了一个侦听器,该侦听器在操作完成时发出通知(完成文件上载/下载或上载/下载一组文件) 创建了一个ProgressDialog来显示操作的进度。当下载/上载管理器调用侦听器时,将填充进度栏 当用户转动屏幕时,问题就出现了。在这种情况下,我可以保存进度条的当前状态,但如何保持对上载/下载侦听器的引用 编辑:当用户打开屏幕时,进度条消失,因为活动中的UI被重新加载。下载/上载过程正常继续,直到完成并调用方法“progressBar.Disclos
public interface UploadDownloadListener {
void operationFinished(File file);
void operationFinished();
}
UploadDownloadManager.java
public void downloadAll(final UploadDownloadListener uploadDownloadListener) {
... on file downloaded ...
uploadDownloadListener.operationFinished(file);
... on all files downloaded ...
uploadDownloadListener.operationFinished();
}
MyActivity.java
public class MyActivity extends FragmentActivity {
private ProgressDialog progressBar;
private Handler progressBarbHandler = new Handler();
...
private void createAndShowProgressDialog(View view, int numberOfFiles, CharSequence title) {
Log.i(TAG, "Create progress dialog. title [" + title + "] max[" + numberOfFiles + "]");
progressBar = new ProgressDialog(view.getContext());
progressBar.setCancelable(false);
progressBar.setMessage(title);
progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressBar.setProgress(0);
progressBar.setMax(numberOfFiles);
progressBar.show();
}
private class ButtonDownloadOnClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
final int numberOfFiles = getFileToDownload.size();
createAndShowProgressDialog(view, numberOfFiles, getResources().getText(R.string.label_download));
new Thread(new Runnable() {
@Override
public void run() {
uploadDownloadManager.uploadAll(getFileToDownload(), getUploadDownloadListener());
}
}).start();
}
private UploadDownloadListener getUploadDownloadListener() {
return new UploadDownloadListener() {
int item = 0;
@Override
public void operationFinished(File file) {
item++;
progressBarbHandler.post(new Runnable() {
public void run() {
progressBar.setProgress(item);
}
});
}
@Override
public void operationFinished() {
sleep(2000);
progressBar.dismiss();
returnToMainActivity();
}
};
}
我解决此类问题的方法是使整个类成为asyncTask,然后在ui类中创建一个公共变量,并从asyncTask类中的post、pre和on progress更新类更新ui。您可以使用asyncTask了解状态并重新启动/不再启动。AsyncTask有一些方法可以知道任务是否已完成或尚未完成。如果任务仍在运行,则无需创建任务。这可能会对您有所帮助。@kumar这里的主要问题是如何在onCreate方法中重新创建进度对话框。后台任务将回调进度对话框方法“setProgress”和“Disclose”,但如果打开屏幕,对话框将不再存在。请记住,打开屏幕时,进度对话框将消失。我如何才能以后台任务可以达到的方式再次创建它?嗯,在研究了这个热带地区后,我没有找到好的答案,并意识到我的应用程序有一个模拟问题:(找到了这个链接,但如果它能正常工作的话,就没有问题了。我刚刚找到了一个解决方案。这个想法是从中得到的。所以基本上,这个想法是创建一个片段来执行异步任务,并使用FragmentManager来找到这个片段。我已经对它进行了测试,效果很好。