Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ProgressDialog与监听器一起设置旋转屏幕上的进度崩溃_Android_Listener_Progressdialog - Fatal编程技术网

Android ProgressDialog与监听器一起设置旋转屏幕上的进度崩溃

Android ProgressDialog与监听器一起设置旋转屏幕上的进度崩溃,android,listener,progressdialog,Android,Listener,Progressdialog,我有一个类来管理文件下载/上传到云上的远程服务。此类实现了一个侦听器,该侦听器在操作完成时发出通知(完成文件上载/下载或上载/下载一组文件) 创建了一个ProgressDialog来显示操作的进度。当下载/上载管理器调用侦听器时,将填充进度栏 当用户转动屏幕时,问题就出现了。在这种情况下,我可以保存进度条的当前状态,但如何保持对上载/下载侦听器的引用 编辑:当用户打开屏幕时,进度条消失,因为活动中的UI被重新加载。下载/上载过程正常继续,直到完成并调用方法“progressBar.Disclos

我有一个类来管理文件下载/上传到云上的远程服务。此类实现了一个侦听器,该侦听器在操作完成时发出通知(完成文件上载/下载或上载/下载一组文件)

创建了一个ProgressDialog来显示操作的进度。当下载/上载管理器调用侦听器时,将填充进度栏

当用户转动屏幕时,问题就出现了。在这种情况下,我可以保存进度条的当前状态,但如何保持对上载/下载侦听器的引用

编辑:当用户打开屏幕时,进度条消失,因为活动中的UI被重新加载。下载/上载过程正常继续,直到完成并调用方法“progressBar.Disclose()”。然后出现了一个例外,因为进度条已经不存在了

解决方案:按照此步骤获得使用片段的解决方案

UploadDownloadListener.java

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来找到这个片段。我已经对它进行了测试,效果很好。