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.

