非同期処理することでFragmentやActivityが破棄されて新たなActivityが生成できない

551 views
Skip to first unread message

宇佐美剛

unread,
Oct 7, 2015, 3:00:37 AM10/7/15
to 日本Androidの会
おこないたいことといたしましては、
Activity:MAP上に配置されているマーカーをクリック
Fragment:ダイアログ上にあるボタンをクリックすると非同期処理と画面遷移をおこなう
Activity:非同期処理後に画面を表示
といった流れです。

現在、悩んでいるところは
Fragmentで非同期処理をおこなうと、
ActivityとFragmentが破棄されて、
非同期処理後にActivityに遷移できなくなっているというものです。

色々と調べてはみたのですが、
解決とまではいかなかったので、
何卒、ご教授いただければと思います。

下記にFragmentと非同期のクラスを記載いたします。
public class AnnotationDialogFragment extends DialogFragment {

   
public String name;
    public String snippet;
    Context context;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

       
int index = snippet.indexOf(":");
        final String id = snippet.substring(0, index);
        snippet = snippet.substring(index + 1);

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(name);
        builder.setMessage(snippet);
        builder.setPositiveButton(R.string.detail, new DialogInterface.OnClickListener() {
           
@Override
            public void onClick(final DialogInterface dialog, int which) {
               
AsyncDetail asyncDetail = new AsyncDetail(new AsyncTaskCallback() {
                   
@Override
                    public void postExecute(String result) {
                        getActivity
();  //この時点では既にActivityとFragmentは破棄されている getActivity() = null
                        Intent intent = new Intent(context, DetailActivity.class);
                        intent.setClassName("パッケージ名", "パッケージ名.DetailActivity");
                        intent.putExtra("result", result);
                        startActivity(intent);
                    }
               
});
                asyncDetail.execute("URL", id);
            }
       
});
        builder.setNegativeButton(R.string.close, new DialogInterface.OnClickListener() {
           
@Override
            public void onClick(DialogInterface dialog, int which) {
               
// TODO Auto-generated method stub
            }
       
});
        return builder.create();
    }

   
@Override
    public void onAttach(Activity activity){
       
super.onAttach(activity);
        context = activity;
    }

}

public class AsyncDetail extends AsyncTask<String, Integer, String> {

   
public AsyncTaskCallback callback = null;

   public AsyncDetail(AsyncTaskCallback _callback) {
     
this.callback = _callback;
   }

   
private HttpClient hClient = new DefaultHttpClient();

   // バックグラウンドで処理
   @Override
   protected String doInBackground(String... params) {
     
String uri = params[0];
      int id = Integer.parseInt( params[1] );
      return PostLocations(uri, id);
   }

   
// バックグラウンド処理が終了した後にメインスレッドに渡す処理
   protected void onPostExecute(String result) {
     
super.onPostExecute(result);
      this.callback.postExecute(result);
   }



   
// 位置情報(JSON)をダウンロード
   private String PostLocations(String uri, int id) {
     
Log.d("PostLocations", "uri=" + uri);
      try {
         
HttpPost post = new HttpPost(uri);
         JSONObject jsonObject = new JSONObject();
         jsonObject.put("id", id);
         StringEntity se = new StringEntity(jsonObject.toString(), "UTF-8");
         post.setHeader("Accept", "application/json");
         post.setHeader("Content-Type", "application/json");
         post.setEntity(se);
         HttpResponse resp = hClient.execute(post);

         if (resp.getStatusLine().getStatusCode() < 400) {
           
Log.v("start","json post success");
            String str = EntityUtils.toString(resp.getEntity(), HTTP.UTF_8);
            return str;
         }
     
} catch (Exception e) {
         
Log.d("PostLocations","error");
         e.printStackTrace();
      }
     
return null;
   }
}



非同期処理後までFragmentが破棄されない方法か
非同期処理する前のFragmentの状態を保持して非同期処理後に呼び出せる方法を
ご享受いただきたいです。

何卒、よろしくお願い致します。

Hirokazu Fukami

unread,
Oct 7, 2015, 3:43:28 AM10/7/15
to 日本Androidの会
こんにちはfkmです。

AlertDialog.BuilderのsetPositiveButton()で設定したイベントは、非同期処理開始と同時に
Dialogを閉じる処理も含まれるので、実際の非同期処理をここで行うべきではありません。

AlertDialogでのYes/Noの処理は、呼び出し元にどちらが選ばれたかだけを伝え、
呼び出し元のFragmentでそれに従って非同期処理を行うのがベストです。

呼び出し元に結果を伝える方法は弊社tech sheetに書いてるのでこちらをどうぞ

--
このメールは Google グループのグループ「日本Androidの会」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには android-group-j...@googlegroups.com にメールを送信してください。
このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

宇佐美剛

unread,
Oct 7, 2015, 4:56:45 AM10/7/15
to 日本Androidの会
fkm様

ご回答ありがとうございます。

setPositiveButton()のonClick時では、非同期処理だけおこない、
Activity側で画面遷移の処理をおこなったら、
うまくいきました。

この度は、誠にありがとうございました。

2015年10月7日水曜日 16時43分28秒 UTC+9 fkm:
...
Reply all
Reply to author
Forward
0 new messages