通信中に画面回転した場合に通信結果を受け取り、画面に表示する方法について
Androidで画面回転したときに、Activity/Fragmentが再生成されますが、通信などの別スレッドが動いている途中に回転された場合にどのように別スレッドの処理結果を再生成後のFragmentなどで受け取ればよいのかで悩んでいます。
(画面レイアウトが縦と横で異なるため、画面が再生成されない方法は使用していません。)
現在デバッグ中のコードの処理概要は下記のような感じです。
ProgressDialogFragment
を表示- Volleyで通信
- Volleyのコールバックで
ProgressDialog
を閉じてActivity/Fragmentに通信で得られた内容を表示
このコードは、通信中に画面を回転されない場合はうまく動作します。
通信中に画面を回転させた場合、getFragmentManager()
でNullpointerException
が発生します。
また、ProgressDialog
関連コードを削除して実行してみましたが、通信結果の表示mTextView.setText(response)
が画面に反映されません。
画面回転時にFragmentが再生成されるために、コールバックされたところが再生成以前の場所のために起こるのだと考えています。
通信中に画面を回転させた場合でも、ProgressDialog
を消し、通信結果を画面に表示するにはどうすればよろしいでしょうか?
public class MyFragment extends Fragment implements View.OnClickListener {
・・・省略・・・
@Override
public void onClick(View v) {
MyProgressDialog dialog = MyProgressDialog.newInstance("メッセージ");
dialog.show(getFragmentManager(), MyProgressDialog.FRAGMENT_TAG);
String url = "http://~~~~~~~~~";
StringRequest request = new StringRequest(url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.v(TAG, response);
mTextView.setText(response);
MyProgressDialog progressDialog = (MyProgressDialog) getFragmentManager().findFragmentByTag(MyProgressDialog.FRAGMENT_TAG);
if (progressDialog != null) {
progressDialog.dismiss();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
MyApplication.getInstance().getRequestQueue().add(request);
}
}