【10月6日質問編集】
おこなっていることは、
dialogfragmentでonClickをすると非同期処理をおこない、
非同期処理が終了したら
Activityの遷移をおこなっております。
しかし、fragmentで非同期処理をおこなうと、
Activityとの接続が切れて
新たなActivityを呼ぼうとした時に
getActivityがnullになってしまい、
遷移できずにエラーになってしまいます。
dialogfragmentで処理しているコードが下記になります。
java
1public class AnnotationDialogFragment extends DialogFragment { 2 3 public String name; 4 public String snippet; 5 Context context; 6 7 @Override 8 public Dialog onCreateDialog(Bundle savedInstanceState) { 9 10 int index = snippet.indexOf(":"); 11 final String id = snippet.substring(0, index); 12 snippet = snippet.substring(index + 1); 13 14 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 15 builder.setTitle(name); 16 builder.setMessage(snippet); 17 builder.setPositiveButton(R.string.detail, new DialogInterface.OnClickListener() { 18 @Override 19 public void onClick(final DialogInterface dialog, int which) { 20 AsyncDetail asyncDetail = new AsyncDetail(new AsyncTaskCallback() { 21 @Override 22 public void postExecute(String result) { //この時点でgetActivityはnull 23 Intent intent = new Intent(getActivity() , DetailActivity.class); 24 intent.setClassName("パッケージ名", "パッケージ名.DetailActivity"); 25 intent.putExtra("result", result); 26 startActivity(intent); 27 } 28 } ); 29 asyncDetail.execute("URL", id); 30 } 31 }); 32 builder.setNegativeButton(R.string.close, new DialogInterface.OnClickListener() { 33 @Override 34 public void onClick(DialogInterface dialog, int which) { 35 // TODO Auto-generated method stub 36 } 37 }); 38 return builder.create(); 39 }
非同期処理をおこなうAsyncTaskを継承したクラスが下記になります。
java
1public class AsyncDetail extends AsyncTask<String, Integer, String> { 2 3 public AsyncTaskCallback callback = null; 4 5 public AsyncDetail(AsyncTaskCallback _callback) { 6 this.callback = _callback; 7 } 8 9 private HttpClient hClient = new DefaultHttpClient(); 10 11 // バックグラウンドで処理 12 @Override 13 protected String doInBackground(String... params) { 14 String uri = params[0]; 15 int id = Integer.parseInt( params[1] ); 16 return PostLocations(uri, id); 17 } 18 19 // バックグラウンド処理が終了した後にメインスレッドに渡す処理 20 protected void onPostExecute(String result) { 21 super.onPostExecute(result); 22 this.callback.postExecute(result); 23 } 24 25 // 位置情報(JSON)をダウンロード 26 private String PostLocations(String uri, int id) { 27 try { 28 HttpPost post = new HttpPost(uri); 29 JSONObject jsonObject = new JSONObject(); 30 jsonObject.put("id", id); 31 StringEntity se = new StringEntity(jsonObject.toString(), "UTF-8"); 32 post.setHeader("Accept", "application/json"); 33 post.setHeader("Content-Type", "application/json"); 34 post.setEntity(se); 35 HttpResponse resp = hClient.execute(post); 36 37 if (resp.getStatusLine().getStatusCode() < 400) { 38 String str = EntityUtils.toString(resp.getEntity(), HTTP.UTF_8); 39 return str; 40 } 41 } catch (Exception e) { 42 e.printStackTrace(); 43 } 44 return null; 45 } 46 47}
コールバックインターフェースを下記に記します。
public interface AsyncTaskCallback { void postExecute(String result); }
非同期処理をさせてもActivityを保持させていられるやり方か、
新たにActivityを生成させるやり方を知りたいです。
また、これらの書き方はよくないということでありましたら、
どんな方法が良いのかお教えいただけますと幸いです。
皆様のお力添えのほど、よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/10/04 09:43
2015/10/04 12:31 編集
2015/10/06 17:51
2015/10/07 07:36
2015/10/07 09:00