旋转后使用ProgressBar更新ProgressDialog

时间:2019-04-29 16:12:09

标签: java android progressdialog android-thread

我的应用程序在线程中处理一些图像,同时显示带有进度条的对话框。

progressDialog = new ProgressDialog(Activity.this);
progressDialog.setProgressStyle(size);
progressDialog.show();
Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        for(int i = 0; i < size; i++{
            //process images
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    progressDialog.setProgress(i);
                }
            });
        }

    }
});
thread.start();

现在,如果发生旋转,我会

@Override
protected void onDestroy() {
    if (progressDialog != null && progressDialog.isShowing()) {
        progressDialog.dismiss();
    }

    super.onDestroy();
}

,然后在onCreate中重新创建对话框。但是该线程不会更改此新对话框的进度栏。

1 个答案:

答案 0 :(得分:1)

旋转后,显示此对话框的活动(或片段)将被丢弃,并创建一个新的活动。

您在新的“活动”中重新创建对话框,但是您启动的线程在旧的对话框中更新了对话框(事实上,该线程引用了旧的对话框也构成了内存泄漏)。

我建议您执行以下操作:

  1. 实现一些ImageProcessor类,并将其实例放入Application对象。
  2. 使ImageProcessor类可观察,并通知侦听器有关的进度。
  3. 在“活动”中获取对此对象的引用,并在onStart()中订阅通知(并在onStop()中取消订阅)。
  4. 状态更新通知到达时-更新进度指示

使用这种方法,您将把处理逻辑封装在一个可以旋转的特殊对象中,并且不同的组件可以调用其方法并订阅来自它的通知。