2

I'm with a little problem that is driving me crazy. I'm using a AsyncTask in a retained Fragment to update a progressDialog in my activity. I'm using callbacks to send the progress from my fragment.

The problem is: When I rotate my screen it simply stops do update the progressDialog in the recreated activity. It seems like onProgressUpdate stops to being called in the rotated activity.

the relevant part of the code is shown below:

Worker Fragment

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);
            }
        }

        ... 

    }
}

and the Activity

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);
                 ...
            }
        }
Leu
  • 1,354
  • 1
  • 10
  • 19
  • I suppose you've to to use `DialogFragment` to solve your problem since when you change the orientation your activity reloads. – Ye Lin Aung Aug 27 '13 at 02:31
  • I think you should read http://stackoverflow.com/a/3821998/1024955 to solve your problem. Or another article http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html – hieuxit Aug 27 '13 at 03:45

1 Answers1

-2

Try to put this code in manifest, where you've indicated your activity

android:configChanges="orientation|screenSize"
Octavio
  • 145
  • 4