当我旋转屏幕时,progressDialog 停止更新

Posted

技术标签:

【中文标题】当我旋转屏幕时,progressDialog 停止更新【英文标题】:progressDialog stops to update when I rotate screen 【发布时间】:2013-08-29 15:14:59 【问题描述】:

我遇到了一个让我发疯的小问题。我在保留的 Fragment 中使用 AsyncTask 来更新我的活动中的 progressDialog。我正在使用回调从我的片段发送进度。

问题是:当我旋转我的屏幕时,它只是停止更新重新创建的活动中的progressDialog。似乎 onProgressUpdate 停止在旋转的活动中被调用。

相关部分代码如下所示:

工人片段

public class WorkerFragment extends Fragment 

    Context mContext;   

    ...

    public static interface TaskCallbacks 
        void onPreExecute();
        void onProgressUpdate(int... progress);
        void onPostExecute();           
    

    @Override
    public void onAttach(Activity activity)        
        super.onAttach(activity);
        mCallbacks = (TaskCallbacks) activity;
    

    @Override
    public void onDetach() 
        super.onDetach();
        mCallbacks = null;
    

    @Override
    public void onCreate(Bundle savedInstanceState) 
      super.onCreate(savedInstanceState);   
      // Retain this fragment across configuration changes.
      setRetainInstance(true);      
    

    //inner class
    class DownloadFileFromURL extends AsyncTask<String, Int, Void> 

        @Override
        public void onPreExecute() 
            if (mCallbacks != null) 
                mCallbacks.onPreExecute();
        

        @Override
        public String doInBackground(String... f_url) 
          ... //some verifications of files
            if(!localFile.exists())
                //http connection, check, buffer, inputstream, etc...
                publishProgress((int)((bytesDownloaded*100)/remoteFileSize));
                ...
            
        

        @Override
        protected void onProgressUpdate(int... percent) 
            if (mCallbacks != null) 
                mCallbacks.onProgressUpdate(percent);
            
        

        ... 

    

和活动

public class Updater extends Activity implements WorkerFragment.TaskCallbacks 
    private WorkerFragment myWorker;
    private ProgressDialog pDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_updater);
        pDialog=null;
        showDialog(1);

        FragmentManager fm = getFragmentManager();
        myWorker = (WorkerFragment) fm.findFragmentByTag("task");
        if(myWorker == null)
        
            myWorker = new WorkerFragment();
            fm.beginTransaction().add(myWorker, "task").commit();               
        

        @Override
        protected Dialog onCreateDialog(int id) 
            switch (id) 
            case 1:
                pDialog = new ProgressDialog(this);
                pDialog.setMessage("Baixando arquivos de mídia");
                pDialog.setIndeterminate(false);
                pDialog.setMax(100);
                pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                pDialog.setCancelable(false);
                pDialog.show();
                dialogType=progress_bar_type;
                return pDialog;
             
         

        @Override
        public void onProgressUpdate(int... progress) 
        //setting progress percentage
            if(pDialog!=null)
            
                 pDialog.setProgress(progress[0]);
            
        

        @Override
        public void onPostExecute() 
            if(pDialog!=null)
            
                 dismissDialog(1);
                 ...
            
        

【问题讨论】:

我想你必须使用 DialogFragment 来解决你的问题,因为当你改变方向时,你的活动会重新加载。 我认为您应该阅读***.com/a/3821998/1024955 来解决您的问题。或另一篇文章androiddesignpatterns.com/2013/04/… 【参考方案1】:

尝试将此代码放在清单中,您已在其中指明了您的活动

android:configChanges="orientation|screenSize"

【讨论】:

以上是关于当我旋转屏幕时,progressDialog 停止更新的主要内容,如果未能解决你的问题,请参考以下文章

Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案

Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案

如何使用 jquery 停止移动屏幕旋转?

旋转屏幕或隐藏播放器时 Android YouTube API 视频暂停

触摸屏幕时关闭进度对话框

onConfigurationChanged 屏幕停止在设备上旋转。在模拟器上工作