質問編集履歴
4
タイトル編集
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
【Android】非同期処理後にページ遷移をしたい
|
1
|
+
【Android】非同期処理後にページ遷移をしたい
|
body
CHANGED
File without changes
|
3
質問変更
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,79 +1,121 @@
|
|
1
|
-
【10月
|
1
|
+
【10月6日質問編集】
|
2
2
|
|
3
|
-
|
3
|
+
おこなっていることは、
|
4
|
-
|
4
|
+
dialogfragmentでonClickをすると非同期処理をおこない、
|
5
|
-
|
5
|
+
非同期処理が終了したら
|
6
|
-
|
6
|
+
Activityの遷移をおこなっております。
|
7
7
|
|
8
|
-
まず、行いたいことといたしましては、
|
9
|
-
|
8
|
+
しかし、fragmentで非同期処理をおこなうと、
|
9
|
+
Activityとの接続が切れて
|
10
|
-
|
10
|
+
新たなActivityを呼ぼうとした時に
|
11
|
+
getActivityがnullになってしまい、
|
11
|
-
|
12
|
+
遷移できずにエラーになってしまいます。
|
12
13
|
|
13
|
-
[Activity からの戻り値をコールバックで受け取る](http://qiita.com/amay077/items/05dc8556f1a8ce07ae62)
|
14
|
-
[Androidの汎用的な非同期通信クラスできたよー!](http://qiita.com/otoyo/items/70cfa89bfa93ffdf6c9a)
|
15
|
-
などを参考にさせていただき、
|
16
|
-
コー
|
14
|
+
dialogfragmentで処理しているコードが下記になります。
|
15
|
+
```java
|
17
|
-
|
16
|
+
public class AnnotationDialogFragment extends DialogFragment {
|
18
17
|
|
18
|
+
public String name;
|
19
|
-
|
19
|
+
public String snippet;
|
20
|
-
|
20
|
+
Context context;
|
21
21
|
|
22
|
-
非同期処理を行なわずに適当な値をintent.putExtraで設定して、新しいActivityを呼ぶことはできるのですが、
|
23
|
-
非同期処理を実装すると、次のようなエラーが起こって新しいActivityが呼べません。
|
24
|
-
|
22
|
+
@Override
|
25
|
-
|
23
|
+
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
26
|
-
```
|
27
24
|
|
25
|
+
int index = snippet.indexOf(":");
|
26
|
+
final String id = snippet.substring(0, index);
|
28
|
-
|
27
|
+
snippet = snippet.substring(index + 1);
|
29
28
|
|
30
|
-
このクラスでダイアログを表示する上での処理をおこないます。
|
31
|
-
```java
|
32
|
-
@Override
|
33
|
-
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
34
29
|
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
35
|
-
|
30
|
+
builder.setTitle(name);
|
31
|
+
builder.setMessage(snippet);
|
36
32
|
builder.setPositiveButton(R.string.detail, new DialogInterface.OnClickListener() {
|
37
33
|
@Override
|
38
|
-
public void onClick(DialogInterface dialog, int which) {
|
34
|
+
public void onClick(final DialogInterface dialog, int which) {
|
39
35
|
AsyncDetail asyncDetail = new AsyncDetail(new AsyncTaskCallback() {
|
40
|
-
|
41
36
|
@Override
|
42
|
-
public void postExecute(String result) {
|
37
|
+
public void postExecute(String result) { //この時点でgetActivityはnull
|
43
|
-
Intent intent = new Intent(
|
38
|
+
Intent intent = new Intent(getActivity() , DetailActivity.class);
|
39
|
+
intent.setClassName("パッケージ名", "パッケージ名.DetailActivity");
|
44
40
|
intent.putExtra("result", result);
|
45
41
|
startActivity(intent);
|
46
42
|
}
|
47
|
-
});
|
43
|
+
} );
|
48
|
-
getActivity().finish();
|
49
44
|
asyncDetail.execute("URL", id);
|
50
45
|
}
|
51
|
-
})
|
46
|
+
});
|
47
|
+
builder.setNegativeButton(R.string.close, new DialogInterface.OnClickListener() {
|
48
|
+
@Override
|
49
|
+
public void onClick(DialogInterface dialog, int which) {
|
50
|
+
// TODO Auto-generated method stub
|
51
|
+
}
|
52
|
+
});
|
52
53
|
return builder.create();
|
53
54
|
}
|
54
55
|
```
|
55
56
|
|
56
|
-
|
57
|
+
非同期処理をおこなうAsyncTaskを継承したクラスが下記になります。
|
57
|
-
```
|
58
|
+
```java
|
58
|
-
|
59
|
+
public class AsyncDetail extends AsyncTask<String, Integer, String> {
|
59
|
-
```
|
60
|
-
です。
|
61
60
|
|
62
|
-
|
61
|
+
public AsyncTaskCallback callback = null;
|
62
|
+
|
63
|
+
public AsyncDetail(AsyncTaskCallback _callback) {
|
63
|
-
|
64
|
+
this.callback = _callback;
|
65
|
+
}
|
66
|
+
|
64
|
-
|
67
|
+
private HttpClient hClient = new DefaultHttpClient();
|
68
|
+
|
69
|
+
// バックグラウンドで処理
|
70
|
+
@Override
|
71
|
+
protected String doInBackground(String... params) {
|
72
|
+
String uri = params[0];
|
73
|
+
int id = Integer.parseInt( params[1] );
|
74
|
+
return PostLocations(uri, id);
|
75
|
+
}
|
76
|
+
|
77
|
+
// バックグラウンド処理が終了した後にメインスレッドに渡す処理
|
78
|
+
protected void onPostExecute(String result) {
|
79
|
+
super.onPostExecute(result);
|
80
|
+
this.callback.postExecute(result);
|
81
|
+
}
|
82
|
+
|
83
|
+
// 位置情報(JSON)をダウンロード
|
84
|
+
private String PostLocations(String uri, int id) {
|
85
|
+
try {
|
86
|
+
HttpPost post = new HttpPost(uri);
|
87
|
+
JSONObject jsonObject = new JSONObject();
|
88
|
+
jsonObject.put("id", id);
|
89
|
+
StringEntity se = new StringEntity(jsonObject.toString(), "UTF-8");
|
90
|
+
post.setHeader("Accept", "application/json");
|
91
|
+
post.setHeader("Content-Type", "application/json");
|
92
|
+
post.setEntity(se);
|
93
|
+
HttpResponse resp = hClient.execute(post);
|
94
|
+
|
95
|
+
if (resp.getStatusLine().getStatusCode() < 400) {
|
96
|
+
String str = EntityUtils.toString(resp.getEntity(), HTTP.UTF_8);
|
97
|
+
return str;
|
98
|
+
}
|
99
|
+
} catch (Exception e) {
|
100
|
+
e.printStackTrace();
|
101
|
+
}
|
102
|
+
return null;
|
103
|
+
}
|
104
|
+
|
105
|
+
}
|
65
106
|
```
|
66
|
-
がおかしいのではないかと思い、右辺を
|
67
|
-
```java
|
68
|
-
new Intent(getActivity() , DetailActivity.class);
|
69
107
|
|
70
|
-
|
108
|
+
コールバックインターフェースを下記に記します。
|
71
109
|
```
|
110
|
+
public interface AsyncTaskCallback {
|
72
|
-
|
111
|
+
void postExecute(String result);
|
112
|
+
}
|
113
|
+
```
|
73
114
|
|
74
|
-
|
115
|
+
非同期処理をさせてもActivityを保持させていられるやり方か、
|
116
|
+
新たにActivityを生成させるやり方を知りたいです。
|
75
117
|
|
76
|
-
|
118
|
+
また、これらの書き方はよくないということでありましたら、
|
77
|
-
|
119
|
+
どんな方法が良いのかお教えいただけますと幸いです。
|
78
120
|
|
79
121
|
皆様のお力添えのほど、よろしくお願い致します。
|
2
質問修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -59,6 +59,18 @@
|
|
59
59
|
```
|
60
60
|
です。
|
61
61
|
|
62
|
+
なお、
|
63
|
+
```java
|
64
|
+
Intent intent = new Intent(context , DetailActivity.class);
|
65
|
+
```
|
66
|
+
がおかしいのではないかと思い、右辺を
|
67
|
+
```java
|
68
|
+
new Intent(getActivity() , DetailActivity.class);
|
69
|
+
|
70
|
+
new Intent(getActivity() , DetailActivity.class);
|
71
|
+
```
|
72
|
+
に変えてやってみましてが、うまくいきませんでした。
|
73
|
+
|
62
74
|
また、非同期処理では、引数のresultに値は返ってきております。
|
63
75
|
|
64
76
|
同期処理では成功するのに、
|
1
質問編集
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,146 +1,67 @@
|
|
1
|
+
【10月4日質問編集】
|
2
|
+
|
1
3
|
[こちら](https://teratail.com/questions/17136)で同じような質問をさせていただいておりました。
|
2
4
|
それにより、大きくコードを変えたのですがエラーがでてしまい、
|
3
5
|
そのエラーの原因と対処法がサイトを調べてもわからなかったので、
|
4
6
|
改めて質問をさせていただきます。
|
5
7
|
|
6
|
-
まず、行いたいことは
|
8
|
+
まず、行いたいことといたしましては、
|
7
|
-
ダイアログでonClickすることで非同期処理をおこない、
|
9
|
+
ダイアログ上でonClickすることで非同期処理をおこない、
|
8
10
|
非同期処理が終了したら、
|
9
|
-
新たなアクティビティ
|
11
|
+
新たなアクティビティを起動したいです。
|
10
12
|
|
11
13
|
[Activity からの戻り値をコールバックで受け取る](http://qiita.com/amay077/items/05dc8556f1a8ce07ae62)
|
12
14
|
[Androidの汎用的な非同期通信クラスできたよー!](http://qiita.com/otoyo/items/70cfa89bfa93ffdf6c9a)
|
13
15
|
などを参考にさせていただき、
|
14
|
-
コールバックインターフェースを実装し
|
16
|
+
コールバックインターフェースを実装し、
|
15
|
-
|
17
|
+
[half_sleeping](https://teratail.com/users/half_sleeping)さんのコメントを参考にコードの改変を行いました。
|
16
|
-
エラーが出力されてしまいました。
|
17
18
|
|
18
|
-
|
19
|
+
その結果、サーバーと接続をして結果は返ってくるのですが、
|
19
|
-
```java
|
20
|
-
@Override
|
21
|
-
|
20
|
+
フラグメントからIntentで新しいActivityに接続できなくて困っております。
|
22
21
|
|
22
|
+
非同期処理を行なわずに適当な値をintent.putExtraで設定して、新しいActivityを呼ぶことはできるのですが、
|
23
|
-
|
23
|
+
非同期処理を実装すると、次のようなエラーが起こって新しいActivityが呼べません。
|
24
|
-
asyncTask.execute("URL", id);
|
25
|
-
getActivity().finish();
|
26
|
-
}
|
27
|
-
```
|
28
|
-
|
29
|
-
そして、AsyncTaskを継承したクラスが下記になります。
|
30
24
|
```java
|
31
|
-
public class AsyncDetail extends AsyncTask<String, Integer, String> {
|
32
|
-
|
33
|
-
private AsyncTaskCallback callback = null;
|
34
|
-
|
35
|
-
public AsyncDetail(AsyncTaskCallback _callback) {
|
36
|
-
this.callback = _callback;
|
37
|
-
}
|
38
|
-
|
39
|
-
private HttpClient hClient;
|
40
|
-
|
25
|
+
java.lang.IllegalStateException: Fragment AnnotationDialogFragment{17e68e3d} not attached to Activity
|
41
|
-
// TODO Auto-generated constructor stub
|
42
|
-
hClient = new DefaultHttpClient();
|
43
|
-
}
|
44
|
-
|
45
|
-
@Override
|
46
|
-
protected String doInBackground(String... params) {
|
47
|
-
String uri = params[0];
|
48
|
-
int id = Integer.parseInt( params[1] );
|
49
|
-
return PostLocations(uri, id);
|
50
|
-
}
|
51
|
-
|
52
|
-
protected void onPreExecute() {
|
53
|
-
super.onPreExecute();
|
54
|
-
this.callback.preExecute();
|
55
|
-
}
|
56
|
-
|
57
|
-
protected void onProgressUpdate(Integer... values) {
|
58
|
-
super.onProgressUpdate(values);
|
59
|
-
this.callback.progressUpdate(values[0]);
|
60
|
-
}
|
61
|
-
|
62
|
-
protected void onPostExecute(String result) {
|
63
|
-
super.onPostExecute(result);
|
64
|
-
this.callback.postExecute(result);
|
65
|
-
}
|
66
|
-
|
67
|
-
protected void onCancelled() {
|
68
|
-
super.onCancelled();
|
69
|
-
this.callback.cancel();
|
70
|
-
}
|
71
|
-
|
72
|
-
private String PostLocations(String uri, int id) {
|
73
|
-
Log.d("PostLocations","uri="+uri);
|
74
|
-
try {
|
75
|
-
HttpPost post = new HttpPost(uri);
|
76
|
-
JSONObject jsonObject = new JSONObject();
|
77
|
-
jsonObject.put("id", id);
|
78
|
-
StringEntity se = new StringEntity(jsonObject.toString(), "UTF-8");
|
79
|
-
post.setHeader("Accept", "application/json");
|
80
|
-
post.setHeader("Content-Type", "application/json");
|
81
|
-
post.setEntity(se);
|
82
|
-
HttpResponse resp = hClient.execute(post);
|
83
|
-
|
84
|
-
if (resp.getStatusLine().getStatusCode() < 400) {
|
85
|
-
Log.v("start","json post success");
|
86
|
-
String str = EntityUtils.toString(resp.getEntity(), HTTP.UTF_8);
|
87
|
-
return str;
|
88
|
-
}
|
89
|
-
|
90
|
-
} catch (Exception e) {
|
91
|
-
Log.d("PostLocations","error");
|
92
|
-
e.printStackTrace();
|
93
|
-
}
|
94
|
-
return null;
|
95
|
-
}
|
96
|
-
}
|
97
|
-
|
98
26
|
```
|
99
27
|
|
100
|
-
コー
|
28
|
+
関係のあるコードを下記に示します。
|
101
|
-
```java
|
102
|
-
public interface AsyncTaskCallback {
|
103
|
-
void preExecute();
|
104
|
-
void postExecute(String result);
|
105
|
-
void progressUpdate(int progress);
|
106
|
-
void cancel();
|
107
|
-
}
|
108
|
-
```
|
109
29
|
|
110
|
-
|
30
|
+
このクラスでダイアログを表示する上での処理をおこないます。
|
111
31
|
```java
|
32
|
+
@Override
|
112
|
-
public
|
33
|
+
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
34
|
+
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
35
|
+
|
36
|
+
builder.setPositiveButton(R.string.detail, new DialogInterface.OnClickListener() {
|
37
|
+
@Override
|
38
|
+
public void onClick(DialogInterface dialog, int which) {
|
39
|
+
AsyncDetail asyncDetail = new AsyncDetail(new AsyncTaskCallback() {
|
113
40
|
|
114
|
-
protected void onCreate(Bundle savedInstanceState) {
|
115
|
-
|
41
|
+
@Override
|
116
|
-
setContentView(R.layout.activity_detail);
|
117
|
-
|
118
|
-
AsyncDetail asyncDetail = new AsyncDetail(new AsyncTaskCallback() {
|
119
|
-
|
42
|
+
public void postExecute(String result) {
|
43
|
+
Intent intent = new Intent(context , DetailActivity.class);
|
44
|
+
intent.putExtra("result", result);
|
45
|
+
startActivity(intent);
|
46
|
+
}
|
47
|
+
});
|
48
|
+
getActivity().finish();
|
49
|
+
asyncDetail.execute("URL", id);
|
120
50
|
}
|
121
|
-
|
122
|
-
public void postExecute(String result) {
|
123
|
-
Log.d("onPostExecute", result);
|
124
|
-
}
|
125
|
-
|
126
|
-
public void progressUpdate(int progress) {
|
127
|
-
}
|
128
|
-
|
129
|
-
public void cancel() {
|
130
|
-
}
|
131
|
-
})
|
51
|
+
})
|
132
|
-
|
52
|
+
return builder.create();
|
133
53
|
}
|
134
|
-
}
|
135
54
|
```
|
136
55
|
|
137
|
-
|
56
|
+
エラーになる箇所は
|
138
|
-
```
|
57
|
+
```Java
|
139
|
-
|
58
|
+
startActivity(intent);
|
140
59
|
```
|
141
|
-
|
60
|
+
です。
|
142
61
|
|
143
|
-
|
62
|
+
また、非同期処理では、引数のresultに値は返ってきております。
|
144
|
-
どこに原因があるのかがわかりません。
|
145
63
|
|
64
|
+
同期処理では成功するのに、
|
65
|
+
非同期処理でエラーが出てしまう理由がわからずに苦戦しております。
|
66
|
+
|
146
67
|
皆様のお力添えのほど、よろしくお願い致します。
|