and did you use that constructor? because the code snippet shows you've 
used the default constructor

On Sunday, September 15, 2013 1:52:22 PM UTC+3, Greenhand wrote:
>
> 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] <javascript:>>
>
>> 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]<javascript:>
>> To unsubscribe from this group, send email to
>> [email protected] <javascript:>
>> 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] <javascript:>.
>> 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