teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

追記

2015/10/07 07:19

投稿

shiolier
shiolier

スコア1156

answer CHANGED
@@ -104,4 +104,25 @@
104
104
  なので、`Fragment#startActivity(Intent)`を呼ぶ前に、設置されているActivityの`Acitivity#finish()`呼んでしまった場合、`Activity#startActivity()`が呼び出せなくなるのだと思います。
105
105
  実際のソースコードでは呼ぶ前にnullチェックをしており、nullの場合に件の例外を投げるようになっていました。
106
106
 
107
- ですので、上に書いたように、`getActivity().finish();`を非同期処理完了時に実行するのがいいと思います。
107
+ ですので、上に書いたように、`getActivity().finish();`を非同期処理完了時に実行するのがいいと思います。
108
+
109
+ ---
110
+
111
+
112
+ `getActivity().finish();`を`postExecute`内に移してみてください。
113
+
114
+ ```Java
115
+ public void onClick(DialogInterface dialog, int which) {
116
+ AsyncDetail asyncDetail = new AsyncDetail(new AsyncTaskCallback() {
117
+ @Override
118
+ public void postExecute(String result) {
119
+ Intent intent = new Intent(getActivity(), DetailActivity.class);
120
+ intent.putExtra("result", result);
121
+ startActivity(intent);
122
+ getActivity().finish(); // ここに移す
123
+ }
124
+ });
125
+ // getActivity().finish();
126
+ asyncDetail.execute("URL", id);
127
+ }
128
+ ```

2

追記

2015/10/07 07:18

投稿

shiolier
shiolier

スコア1156

answer CHANGED
@@ -94,4 +94,14 @@
94
94
  ```
95
95
 
96
96
  非同期処理開始前に、Activityをfinishしているのに、非同期処理完了時に、`getActivity()`でActivityを取得しようとしています。
97
- `getActivity().finish();`を非同期処理完了時に実行するか、別の方法でContextを取得してみてください。
97
+ `getActivity().finish();`を非同期処理完了時に実行するか、別の方法でContextを取得してみてください。
98
+
99
+
100
+ ---
101
+
102
+
103
+ Fragmentのコードを確認したところ、`Fragment#startActivity(Intent)`はFragment自身が設置されているActivityの`Activity#startActivity()`を呼ぶような処理をしています。
104
+ なので、`Fragment#startActivity(Intent)`を呼ぶ前に、設置されているActivityの`Acitivity#finish()`呼んでしまった場合、`Activity#startActivity()`が呼び出せなくなるのだと思います。
105
+ 実際のソースコードでは呼ぶ前にnullチェックをしており、nullの場合に件の例外を投げるようになっていました。
106
+
107
+ ですので、上に書いたように、`getActivity().finish();`を非同期処理完了時に実行するのがいいと思います。

1

追記

2015/10/04 14:44

投稿

shiolier
shiolier

スコア1156

answer CHANGED
@@ -71,4 +71,27 @@
71
71
  目的にそうとしたら、大まかなコードですが、こんな感じになるのではないでしょうか。
72
72
 
73
73
 
74
- `AsyncDetail`にも怪しいコードがありますが、質問内容とは離れるため、ひとまずはノータッチです。すいません。
74
+ `AsyncDetail`にも怪しいコードがありますが、質問内容とは離れるため、ひとまずはノータッチです。すいません。
75
+
76
+
77
+ ---
78
+
79
+ 2015/10/4 追記
80
+ 例外のスタックトレースが無いので、推測になってしまいますが、原因は以下の部分かもしれません。
81
+ ```Java
82
+ public void onClick(DialogInterface dialog, int which) {
83
+ AsyncDetail asyncDetail = new AsyncDetail(new AsyncTaskCallback() {
84
+ @Override
85
+ public void postExecute(String result) {
86
+ Intent intent = new Intent(getActivity(), DetailActivity.class); // ココ
87
+ intent.putExtra("result", result);
88
+ startActivity(intent);
89
+ }
90
+ });
91
+ getActivity().finish(); // ココ
92
+ asyncDetail.execute("URL", id);
93
+ }
94
+ ```
95
+
96
+ 非同期処理開始前に、Activityをfinishしているのに、非同期処理完了時に、`getActivity()`でActivityを取得しようとしています。
97
+ `getActivity().finish();`を非同期処理完了時に実行するか、別の方法でContextを取得してみてください。