質問編集履歴

4

タイトル編集

2015/10/06 18:05

投稿

GH_usami13
GH_usami13

スコア24

test CHANGED
@@ -1 +1 @@
1
- 【Android】非同期処理後にページ遷移をしたい(続き)
1
+ 【Android】非同期処理後にページ遷移をしたい
test CHANGED
File without changes

3

質問変更

2015/10/06 18:05

投稿

GH_usami13
GH_usami13

スコア24

test CHANGED
File without changes
test CHANGED
@@ -1,156 +1,240 @@
1
- 【10月4日質問編集】
1
+ 【10月日質問編集】
2
-
3
-
4
-
5
- [こちら](https://teratail.com/questions/17136)で同じような質問をさせていただいておりました。
2
+
6
-
7
- それにより、大きくコードを変えたのですがエラーがでてしまい、
3
+
8
-
9
- そのエラーの原因と対処法がサイトを調べてもわからなかったので、
4
+
10
-
11
- 改めて質問をさせていただきます。
12
-
13
-
14
-
15
- まず、行たいことといたしましては、
5
+ おこなってことは、
16
-
6
+
17
- ダイアログ上でonClickする非同期処理をおこない、
7
+ dialogfragmentでonClickすると非同期処理をおこない、
18
-
8
+
19
- 非同期処理が終了したら
9
+ 非同期処理が終了したら
10
+
20
-
11
+ Activityの遷移をおこなっております。
12
+
13
+
14
+
15
+ しかし、fragmentで非同期処理をおこなうと、
16
+
17
+ Activityとの接続が切れて
18
+
19
+ 新たなActivityを呼ぼうとした時に
20
+
21
+ getActivityがnullになってしまい、
22
+
21
- 新たアクティビティを起動す。
23
+ 遷移できずにエラーにってす。
22
-
23
-
24
-
25
- [Activity からの戻り値をコールバックで受け取る](http://qiita.com/amay077/items/05dc8556f1a8ce07ae62)
24
+
26
-
27
- [Androidの汎用的な非同期通信クラスできたよー!](http://qiita.com/otoyo/items/70cfa89bfa93ffdf6c9a)
25
+
28
-
29
- などを参考にさせていただき、
26
+
30
-
31
- コールバックインターフェースを実装し、
32
-
33
- [half_sleeping](https://teratail.com/users/half_sleeping)さんのコメントを参考にコードの改変を行いました。
34
-
35
-
36
-
37
- その結果、サーバーと接続をして結果は返ってくるのですが、
38
-
39
- フラグメントからIntentでしいActivity接続できくて困っております。
27
+ dialogfragmentで処理るコードが下記になります。
40
-
41
-
42
-
43
- 非同期処理を行なわずに適当な値をintent.putExtraで設定して、新しいActivityを呼ぶことはできるのですが、
44
-
45
- 非同期処理を実装すると、次のようなエラーが起こって新しいActivityが呼べません。
46
28
 
47
29
  ```java
48
30
 
49
- java.lang.IllegalStateException: Fragment AnnotationDialogFragment{17e68e3d} not attached to Activity
31
+ public class AnnotationDialogFragment extends DialogFragment {
32
+
33
+
34
+
50
-
35
+ public String name;
36
+
37
+ public String snippet;
38
+
39
+ Context context;
40
+
41
+
42
+
43
+ @Override
44
+
45
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
46
+
47
+
48
+
49
+ int index = snippet.indexOf(":");
50
+
51
+ final String id = snippet.substring(0, index);
52
+
53
+ snippet = snippet.substring(index + 1);
54
+
55
+
56
+
57
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
58
+
59
+ builder.setTitle(name);
60
+
61
+ builder.setMessage(snippet);
62
+
63
+ builder.setPositiveButton(R.string.detail, new DialogInterface.OnClickListener() {
64
+
65
+ @Override
66
+
67
+ public void onClick(final DialogInterface dialog, int which) {
68
+
69
+ AsyncDetail asyncDetail = new AsyncDetail(new AsyncTaskCallback() {
70
+
71
+ @Override
72
+
73
+ public void postExecute(String result) { //この時点でgetActivityはnull
74
+
75
+ Intent intent = new Intent(getActivity() , DetailActivity.class);
76
+
77
+ intent.setClassName("パッケージ名", "パッケージ名.DetailActivity");
78
+
79
+ intent.putExtra("result", result);
80
+
81
+ startActivity(intent);
82
+
83
+ }
84
+
85
+ } );
86
+
87
+ asyncDetail.execute("URL", id);
88
+
89
+ }
90
+
91
+ });
92
+
93
+ builder.setNegativeButton(R.string.close, new DialogInterface.OnClickListener() {
94
+
95
+ @Override
96
+
97
+ public void onClick(DialogInterface dialog, int which) {
98
+
99
+ // TODO Auto-generated method stub
100
+
101
+ }
102
+
103
+ });
104
+
105
+ return builder.create();
106
+
107
+ }
108
+
51
- ```
109
+ ```
52
-
53
-
54
-
55
- 関係のあるコードを下記に示します。
110
+
56
-
57
-
58
-
111
+
112
+
59
- このクラスでダイアログを表示する上での処理をおこなます。
113
+ 非同期処理をおこなうAsyncTaskを継承したクラスが下記になります。
60
114
 
61
115
  ```java
62
116
 
63
- @Override
64
-
65
- public Dialog onCreateDialog(Bundle savedInstanceState) {
66
-
67
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
68
-
69
-
70
-
71
- builder.setPositiveButton(R.string.detail, new DialogInterface.OnClickListener() {
72
-
73
- @Override
74
-
75
- public void onClick(DialogInterface dialog, int which) {
76
-
77
- AsyncDetail asyncDetail = new AsyncDetail(new AsyncTaskCallback() {
78
-
79
-
80
-
81
- @Override
82
-
83
- public void postExecute(String result) {
84
-
85
- Intent intent = new Intent(context , DetailActivity.class);
86
-
87
- intent.putExtra("result", result);
88
-
89
- startActivity(intent);
90
-
91
- }
92
-
93
- });
94
-
95
- getActivity().finish();
96
-
97
- asyncDetail.execute("URL", id);
98
-
99
- }
100
-
101
- })
102
-
103
- return builder.create();
104
-
105
- }
106
-
107
- ```
108
-
109
-
110
-
111
- エラになる箇所は
112
-
113
- ```Java
114
-
115
- startActivity(intent);
116
-
117
- ```
118
-
119
- です。
120
-
121
-
122
-
123
- なお、
124
-
125
- ```java
126
-
127
- Intent intent = new Intent(context , DetailActivity.class);
128
-
129
- ```
130
-
131
- がおかしいのではないかと思い、右辺を
132
-
133
- ```java
134
-
135
- new Intent(getActivity() , DetailActivity.class);
136
-
137
-
138
-
139
- new Intent(getActivity() , DetailActivity.class);
140
-
141
- ```
142
-
143
- に変えてやってみましてが、うまくいきませんでした。
144
-
145
-
146
-
147
- また、非同期処理では、引数のresultに値は返ってきております。
148
-
149
-
150
-
151
- 同期処理では成功するのに、
152
-
153
- 非同期処理でエラーが出てしまう理由がわからずに苦戦しております。
117
+ public class AsyncDetail extends AsyncTask<String, Integer, String> {
118
+
119
+
120
+
121
+ public AsyncTaskCallback callback = null;
122
+
123
+
124
+
125
+ public AsyncDetail(AsyncTaskCallback _callback) {
126
+
127
+ this.callback = _callback;
128
+
129
+ }
130
+
131
+
132
+
133
+ private HttpClient hClient = new DefaultHttpClient();
134
+
135
+
136
+
137
+ // バックグラウンドで処理
138
+
139
+ @Override
140
+
141
+ protected String doInBackground(String... params) {
142
+
143
+ String uri = params[0];
144
+
145
+ int id = Integer.parseInt( params[1] );
146
+
147
+ return PostLocations(uri, id);
148
+
149
+ }
150
+
151
+
152
+
153
+ // バックグラウンド処理が終了した後にメインスレッドに渡す処理
154
+
155
+ protected void onPostExecute(String result) {
156
+
157
+ super.onPostExecute(result);
158
+
159
+ this.callback.postExecute(result);
160
+
161
+ }
162
+
163
+
164
+
165
+ // 位置情報(JSON)をダウンロ
166
+
167
+ private String PostLocations(String uri, int id) {
168
+
169
+ try {
170
+
171
+ HttpPost post = new HttpPost(uri);
172
+
173
+ JSONObject jsonObject = new JSONObject();
174
+
175
+ jsonObject.put("id", id);
176
+
177
+ StringEntity se = new StringEntity(jsonObject.toString(), "UTF-8");
178
+
179
+ post.setHeader("Accept", "application/json");
180
+
181
+ post.setHeader("Content-Type", "application/json");
182
+
183
+ post.setEntity(se);
184
+
185
+ HttpResponse resp = hClient.execute(post);
186
+
187
+
188
+
189
+ if (resp.getStatusLine().getStatusCode() < 400) {
190
+
191
+ String str = EntityUtils.toString(resp.getEntity(), HTTP.UTF_8);
192
+
193
+ return str;
194
+
195
+ }
196
+
197
+ } catch (Exception e) {
198
+
199
+ e.printStackTrace();
200
+
201
+ }
202
+
203
+ return null;
204
+
205
+ }
206
+
207
+
208
+
209
+ }
210
+
211
+ ```
212
+
213
+
214
+
215
+ コールバックインターフェースを下記に記します。
216
+
217
+ ```
218
+
219
+ public interface AsyncTaskCallback {
220
+
221
+ void postExecute(String result);
222
+
223
+ }
224
+
225
+ ```
226
+
227
+
228
+
229
+ 非同期処理をさせてもActivityを保持させていられるやり方か、
230
+
231
+ 新たにActivityを生成させるやり方を知りたいです。
232
+
233
+
234
+
235
+ また、これらの書き方はよくないということでありましたら、
236
+
237
+ どんな方法が良いのかお教えいただけますと幸いです。
154
238
 
155
239
 
156
240
 

2

質問修正

2015/10/06 18:04

投稿

GH_usami13
GH_usami13

スコア24

test CHANGED
File without changes
test CHANGED
@@ -120,6 +120,30 @@
120
120
 
121
121
 
122
122
 
123
+ なお、
124
+
125
+ ```java
126
+
127
+ Intent intent = new Intent(context , DetailActivity.class);
128
+
129
+ ```
130
+
131
+ がおかしいのではないかと思い、右辺を
132
+
133
+ ```java
134
+
135
+ new Intent(getActivity() , DetailActivity.class);
136
+
137
+
138
+
139
+ new Intent(getActivity() , DetailActivity.class);
140
+
141
+ ```
142
+
143
+ に変えてやってみましてが、うまくいきませんでした。
144
+
145
+
146
+
123
147
  また、非同期処理では、引数のresultに値は返ってきております。
124
148
 
125
149
 

1

質問編集

2015/10/04 10:36

投稿

GH_usami13
GH_usami13

スコア24

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,7 @@
1
+ 【10月4日質問編集】
2
+
3
+
4
+
1
5
  [こちら](https://teratail.com/questions/17136)で同じような質問をさせていただいておりました。
2
6
 
3
7
  それにより、大きくコードを変えたのですがエラーがでてしまい、
@@ -8,13 +12,13 @@
8
12
 
9
13
 
10
14
 
11
- まず、行いたいことは
15
+ まず、行いたいことといたしまして
12
16
 
13
- ダイアログでonClickすることで非同期処理をおこない、
17
+ ダイアログでonClickすることで非同期処理をおこない、
14
18
 
15
19
  非同期処理が終了したら、
16
20
 
17
- 新たなアクティビティで処理後の内容出力したいです。
21
+ 新たなアクティビティを起動したいです。
18
22
 
19
23
 
20
24
 
@@ -24,267 +28,105 @@
24
28
 
25
29
  などを参考にさせていただき、
26
30
 
27
- コールバックインターフェースを実装しましたが
31
+ コールバックインターフェースを実装し、
28
32
 
29
- アクティビティからコールバック呼べず、
33
+ [half_sleeping](https://teratail.com/users/half_sleeping)さんのメントを参考にコドの改変行いました。
30
-
31
- エラーが出力されてしまいました。
32
34
 
33
35
 
34
36
 
37
+ その結果、サーバーと接続をして結果は返ってくるのですが、
38
+
39
+ フラグメントからIntentで新しいActivityに接続できなくて困っております。
40
+
41
+
42
+
43
+ 非同期処理を行なわずに適当な値をintent.putExtraで設定して、新しいActivityを呼ぶことはできるのですが、
44
+
45
+ 非同期処理を実装すると、次のようなエラーが起こって新しいActivityが呼べません。
46
+
47
+ ```java
48
+
49
+ java.lang.IllegalStateException: Fragment AnnotationDialogFragment{17e68e3d} not attached to Activity
50
+
51
+ ```
52
+
53
+
54
+
55
+ 関係のあるコードを下記に示します。
56
+
57
+
58
+
35
- まず、AsyncTaskを呼ぶクラスが下記にます。
59
+ このクラスでダイアログを表示する上での処理をおこます。
36
60
 
37
61
  ```java
38
62
 
39
63
  @Override
40
64
 
65
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
66
+
67
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
68
+
69
+
70
+
71
+ builder.setPositiveButton(R.string.detail, new DialogInterface.OnClickListener() {
72
+
73
+ @Override
74
+
41
- public void onClick(DialogInterface dialog, int which) {
75
+ public void onClick(DialogInterface dialog, int which) {
76
+
77
+ AsyncDetail asyncDetail = new AsyncDetail(new AsyncTaskCallback() {
42
78
 
43
79
 
44
80
 
45
- AsyncDetail asyncTask = new AsyncDetail(this);
81
+ @Override
46
82
 
83
+ public void postExecute(String result) {
84
+
85
+ Intent intent = new Intent(context , DetailActivity.class);
86
+
47
- asyncTask.execute("URL", id);
87
+ intent.putExtra("result", result);
88
+
89
+ startActivity(intent);
90
+
91
+ }
92
+
93
+ });
48
94
 
49
95
  getActivity().finish();
50
96
 
97
+ asyncDetail.execute("URL", id);
98
+
51
- }
99
+ }
100
+
101
+ })
102
+
103
+ return builder.create();
104
+
105
+ }
52
106
 
53
107
  ```
54
108
 
55
109
 
56
110
 
57
- そして、AsyncTaskを継承したクスが下記になります。
111
+ になる箇所は
58
112
 
59
- ```java
113
+ ```Java
60
114
 
61
- public class AsyncDetail extends AsyncTask<String, Integer, String> {
115
+ startActivity(intent);
116
+
117
+ ```
118
+
119
+ です。
62
120
 
63
121
 
64
122
 
65
- private AsyncTaskCallback callback = null;
123
+ また、非同期処理では、引数のresultに値は返ってきております。
66
124
 
67
125
 
68
126
 
69
- public AsyncDetail(AsyncTaskCallback _callback) {
127
+ 同期処理では成功するのに、
70
128
 
71
- this.callback = _callback;
72
-
73
- }
74
-
75
-
76
-
77
- private HttpClient hClient;
78
-
79
- public AsyncDetail(android.content.DialogInterface.OnClickListener onClickListener) {
80
-
81
- // TODO Auto-generated constructor stub
82
-
83
- hClient = new DefaultHttpClient();
84
-
85
- }
86
-
87
-
88
-
89
- @Override
90
-
91
- protected String doInBackground(String... params) {
92
-
93
- String uri = params[0];
94
-
95
- int id = Integer.parseInt( params[1] );
96
-
97
- return PostLocations(uri, id);
98
-
99
- }
100
-
101
-
102
-
103
- protected void onPreExecute() {
104
-
105
- super.onPreExecute();
106
-
107
- this.callback.preExecute();
108
-
109
- }
110
-
111
-
112
-
113
- protected void onProgressUpdate(Integer... values) {
114
-
115
- super.onProgressUpdate(values);
116
-
117
- this.callback.progressUpdate(values[0]);
118
-
119
- }
120
-
121
-
122
-
123
- protected void onPostExecute(String result) {
124
-
125
- super.onPostExecute(result);
126
-
127
- this.callback.postExecute(result);
128
-
129
- }
130
-
131
-
132
-
133
- protected void onCancelled() {
134
-
135
- super.onCancelled();
136
-
137
- this.callback.cancel();
138
-
139
- }
140
-
141
-
142
-
143
- private String PostLocations(String uri, int id) {
144
-
145
- Log.d("PostLocations","uri="+uri);
146
-
147
- try {
148
-
149
- HttpPost post = new HttpPost(uri);
150
-
151
- JSONObject jsonObject = new JSONObject();
152
-
153
- jsonObject.put("id", id);
154
-
155
- StringEntity se = new StringEntity(jsonObject.toString(), "UTF-8");
156
-
157
- post.setHeader("Accept", "application/json");
158
-
159
- post.setHeader("Content-Type", "application/json");
160
-
161
- post.setEntity(se);
162
-
163
- HttpResponse resp = hClient.execute(post);
164
-
165
-
166
-
167
- if (resp.getStatusLine().getStatusCode() < 400) {
168
-
169
- Log.v("start","json post success");
170
-
171
- String str = EntityUtils.toString(resp.getEntity(), HTTP.UTF_8);
172
-
173
- return str;
174
-
175
- }
176
-
177
-
178
-
179
- } catch (Exception e) {
180
-
181
- Log.d("PostLocations","error");
182
-
183
- e.printStackTrace();
184
-
185
- }
186
-
187
- return null;
188
-
189
- }
190
-
191
- }
192
-
193
-
194
-
195
- ```
196
-
197
-
198
-
199
- コールバックインターフェースがこちらです。
200
-
201
- ```java
202
-
203
- public interface AsyncTaskCallback {
204
-
205
- void preExecute();
206
-
207
- void postExecute(String result);
129
+ 非同期処理でエラーが出てしまう理由がわからずに苦戦しております。
208
-
209
- void progressUpdate(int progress);
210
-
211
- void cancel();
212
-
213
- }
214
-
215
- ```
216
-
217
-
218
-
219
- 最後に遷移後のアクティビティがこちらです。
220
-
221
- ```java
222
-
223
- public class DetailActivity extends Activity {
224
-
225
-
226
-
227
- protected void onCreate(Bundle savedInstanceState) {
228
-
229
- super.onCreate(savedInstanceState);
230
-
231
- setContentView(R.layout.activity_detail);
232
-
233
-
234
-
235
- AsyncDetail asyncDetail = new AsyncDetail(new AsyncTaskCallback() {
236
-
237
- public void preExecute() {
238
-
239
- }
240
-
241
-
242
-
243
- public void postExecute(String result) {
244
-
245
- Log.d("onPostExecute", result);
246
-
247
- }
248
-
249
-
250
-
251
- public void progressUpdate(int progress) {
252
-
253
- }
254
-
255
-
256
-
257
- public void cancel() {
258
-
259
- }
260
-
261
- });
262
-
263
- asyncDetail.execute();
264
-
265
- }
266
-
267
- }
268
-
269
- ```
270
-
271
-
272
-
273
- これを実行すると、
274
-
275
- ```java
276
-
277
- java.lang.NullPointerException: Attempt to invoke interface method 'void パッケージ名.AsyncTaskCallback.preExecute()' on a null object reference
278
-
279
- ```
280
-
281
- となります。
282
-
283
-
284
-
285
- これは、遷移後のアクティビティを呼び出せていないから起こるのかなと思うのですが、
286
-
287
- どこに原因があるのかがわかりません。
288
130
 
289
131
 
290
132