Thanks for pointing out the mistakes. The whole code is too long to post
and maintain readability so I just put some snippet. The "MyAsyncTask
 having a constructor named GetTokenAsyncTask" is  a typo, the constructor
should named MyAsyncTask.
As for ProgressFragment, I use its toString() method to check using
Log.d(). They are the same across rotation.



2013/9/15 Piren <[email protected]>

> It's hard to follow your code since it seems some of it is incorrect
> (like  MyAsyncTask   having a constructor named GetTokenAsyncTask) and some
> of it is missing...
> Either way you should verify you actually used that constructor (in the
> current code you don't, so the member "fragment" is null).Either case, you
> should also verify that the proper ProgressFragment is being set during
> onAttach of FragmentA since i assume a new one will be created after
> rotation (though i'm not sure about that).
>
> Since this isn't that much code, you should probably just find a tutorial
> on how to do that (there's a lot of those online) and start from scratch
> (just so you wouldn't miss something)
>
> On Sunday, September 15, 2013 1:30:20 PM UTC+3, Greenhand wrote:
>>
>> I use appcompat library to host some fragments for tabs. In a specific
>> fragment A, I need to do network operation. In order not to block the UI
>> thread, I use an AsyncTask and do the network operation in
>> doInBackGround().
>>
>> To prevent messing around keep AsyncTask to survive rotation in the
>> fragment, I call setRetainInstance(true) in the fragment A oncreate().
>>
>> It works fine but I need to prompt user something when the network
>> operation is in progress. Therefore, I use DialogFragment. In the
>> DialogFragment onCreateView(), it instantiates a ProgressDialog and returns.
>>
>> To be concrete, the following is the code snippets of FragmentA,
>> MyDialogFragment and AsyncTask :
>> public class FragmentA extends Fragment{ //as tab for actionbar
>> (appcompat)
>>  private boolean isNetworkOperationCalled;
>>  private MyDialogFragment myDialogFragment;
>>  ...
>>  public void showProgressDialog(){ //for MyAsyncTask#onPreExecute()
>>   myDialogFragment = new MyDialogFragment();
>>   myDialogFragment.show(**getFragmentManager(), "mydialog");
>>  }
>>  public void showProgressDialog(){ //for MyAsyncTask#onPostExecute()
>>   myDialogFragment.dismiss();
>>  }
>>  public void onResume() {
>>   if(!**isNetworkOperationCalled){
>>    isNetworkOperationCalled=true;
>>    new MyAsyncTask.execute();//do the network operation
>>   }
>>  }
>>  ...
>> }
>>
>>
>> public class MyDialogFragment extends DialogFragment{ //ProgressDialog
>> for FragmentA
>>  ...
>>  public Dialog onCreateDialog(Bundle savedInstanceState) {
>>   ProgressDialog progressDialog = new ProgressDialog(getActivity(),**
>> ProgressDialog.STYLE_SPINNER);
>>   ... //set the dialog attributes
>>   return progressDialog;
>>  }
>>  ...
>> }
>> public class MyAsyncTask extends AsyncTask<Void,Void,Void>{ //do network
>> operation
>>  private Fragment fragment;
>>
>>  public GetTokenAsyncTask(Fragment fragmentA){
>>   fragment = fragmentA;
>>  }
>>  protected void onPreExecute() {
>>   fragment.showProgressDialog(**); //show progess dialog for users
>>  }
>>  protected String doInBackground(Void... arg0) {
>>   ...
>>  }
>>  protected void onPostExecute() { //dismiss the dialog
>>   fragment.**dismissProgressDialog();
>>  }
>> }
>> In a nutshell, fragment A triggers AsyncTask and AsyncTask call methods
>> of FragmentA to show/dismiss dialog. Fragment A use MyDialogFragment to
>> show the progress dialog.
>>
>> The code (method) above works if there is no rotataion occurs while
>> doInBackground() is executing. Nevertheless, if the rotation happens before
>> onPostExecute() is called,
>> the rotation is fine and the progress dialog is retained. Sadly, it
>> crashes when onPostExecute() finally be called when dismissing the dialog.
>>
>> E/AndroidRuntime(27493): FATAL EXCEPTION: main
>> E/AndroidRuntime(27493): java.lang.NullPointerException
>> E/AndroidRuntime(27493):  at android.support.v4.app.**DialogFragment.**
>> dismissInternal(**DialogFragment.java:184)
>> E/AndroidRuntime(27493):  at android.support.v4.app.**
>> DialogFragment.dismiss(**DialogFragment.java:155)
>> E/AndroidRuntime(27493):  at com.example.FragmentA.**
>> dismissProgressDialog(**FragmentA.java:105)
>> E/AndroidRuntime(27493):  at com.example.FragmentA.access$**
>> 1(FragmentA.java:103)
>> E/AndroidRuntime(27493):  at com.example.FragmentA$**GetTokenAsyncTask.**
>> onPostExecute(FragmentA.java:**40)
>> E/AndroidRuntime(27493):  at com.example.FragmentA$**GetTokenAsyncTask.**
>> onPostExecute(FragmentA.java:**1)
>> E/AndroidRuntime(27493):  at android.os.AsyncTask.finish(**
>> AsyncTask.java:631)
>> E/AndroidRuntime(27493):  at android.os.AsyncTask.access$**
>> 600(AsyncTask.java:177)
>> E/AndroidRuntime(27493):  at android.os.AsyncTask$**
>> InternalHandler.handleMessage(**AsyncTask.java:644)
>> E/AndroidRuntime(27493):  at android.os.Handler.**
>> dispatchMessage(Handler.java:**99)
>> E/AndroidRuntime(27493):  at android.os.Looper.loop(Looper.**java:137)
>> E/AndroidRuntime(27493):  at android.app.ActivityThread.**
>> main(ActivityThread.java:4875)
>> E/AndroidRuntime(27493):  at java.lang.reflect.Method.**invokeNative(Native
>> Method)
>> E/AndroidRuntime(27493):  at java.lang.reflect.Method.**
>> invoke(Method.java:511)
>> E/AndroidRuntime(27493):  at com.android.internal.os.**ZygoteInit$**
>> MethodAndArgsCaller.run(**ZygoteInit.java:804)
>> E/AndroidRuntime(27493):  at com.android.internal.os.**
>> ZygoteInit.main(ZygoteInit.**java:571)
>> E/AndroidRuntime(27493):  at dalvik.system.NativeStart.**main(Native
>> Method)
>>
>> How can I solve the problem so that the dialog can dismiss correctly
>> after rotation?
>>
>  --
> You received this message because you are subscribed to the Google
> Groups "Android Developers" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/android-developers?hl=en
> ---
> You received this message because you are subscribed to a topic in the
> Google Groups "Android Developers" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/android-developers/Nzwk2PBQtAQ/unsubscribe
> .
> To unsubscribe from this group and all its topics, send an email to
> [email protected].
> For more options, visit https://groups.google.com/groups/opt_out.
>

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to