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

質問編集履歴

4

タイトル編集

2015/10/06 18:05

投稿

GH_usami13
GH_usami13

スコア24

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

3

質問変更

2015/10/06 18:05

投稿

GH_usami13
GH_usami13

スコア24

title CHANGED
File without changes
body CHANGED
@@ -1,79 +1,121 @@
1
- 【10月4日質問編集】
1
+ 【10月日質問編集】
2
2
 
3
- [ちら](https://teratail.com/questions/17136)で同じよう質問をさせていただいておりました。
3
+ こなていることは、
4
- それにより、大きくコードを変えたのですがエラーがでてしまい、
4
+ dialogfragmentonClickをると非同期処理をおこない、
5
- そのエラーの原因と対サイトを調べてもわからなかっので、
5
+ 非同期終了し
6
- 改めて質問させいただきます。
6
+ Activityの遷移おこなっおります。
7
7
 
8
- まず、行いたいことといたしましては、
9
- ダイアログ上onClickすることで非同期処理をおこな
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
- [half_sleeping](https://teratail.com/users/half_sleeping)さんのコメントを参考にコードの改変を行いました。
16
+ public class AnnotationDialogFragment extends DialogFragment {
18
17
 
18
+ public String name;
19
- その結果、サーバーと接続をして結果は返ってくるのですが、
19
+ public String snippet;
20
- フラグメントからIntentで新しいActivityに接続できなくて困っております。
20
+ Context context;
21
21
 
22
- 非同期処理を行なわずに適当な値をintent.putExtraで設定して、新しいActivityを呼ぶことはできるのですが、
23
- 非同期処理を実装すると、次のようなエラーが起こって新しいActivityが呼べません。
24
- ```java
22
+ @Override
25
- java.lang.IllegalStateException: Fragment AnnotationDialogFragment{17e68e3d} not attached to Activity
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(context , DetailActivity.class);
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
- ```Java
58
+ ```java
58
- startActivity(intent);
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
- ```java
64
+ this.callback = _callback;
65
+ }
66
+
64
- Intent intent = new Intent(context , DetailActivity.class);
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
- new Intent(getActivity() , DetailActivity.class);
108
+ コールバックインターフェースを下記に記します。
71
109
  ```
110
+ public interface AsyncTaskCallback {
72
- に変えてやってみましてが、うまくいきませんでした。
111
+ void postExecute(String result);
112
+ }
113
+ ```
73
114
 
74
- また、非同期処理では、引数のresultに値は返っます。
115
+ 非同期処理をさせもActivityを保持させいられるや方か、
116
+ 新たにActivityを生成させるやり方を知りたいです。
75
117
 
76
- 同期処理では成功する
118
+ また、これら書き方はよくないということでありましたら
77
- 非同期処理でエラー出てしまう理由がわらずに苦戦してます。
119
+ どんな方法良いのかお教えいただけますと幸いです
78
120
 
79
121
  皆様のお力添えのほど、よろしくお願い致します。

2

質問修正

2015/10/06 18:04

投稿

GH_usami13
GH_usami13

スコア24

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

質問編集

2015/10/04 10:36

投稿

GH_usami13
GH_usami13

スコア24

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
- まずAsyncTask呼ぶクラスが下記になりま
19
+ その結果サーバーと接続して結果は返ってくるのでが、
19
- ```java
20
- @Override
21
- public void onClick(DialogInterface dialog, int which) {
20
+ フラグメントからIntentで新しいActivityに接続できなくて困っております。
22
21
 
22
+ 非同期処理を行なわずに適当な値をintent.putExtraで設定して、新しいActivityを呼ぶことはできるのですが、
23
- AsyncDetail asyncTask = new AsyncDetail(this);
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
- public AsyncDetail(android.content.DialogInterface.OnClickListener onClickListener) {
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 class DetailActivity extends Activity {
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
- super.onCreate(savedInstanceState);
41
+ @Override
116
- setContentView(R.layout.activity_detail);
117
-
118
- AsyncDetail asyncDetail = new AsyncDetail(new AsyncTaskCallback() {
119
- public void preExecute() {
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
- asyncDetail.execute();
52
+ return builder.create();
133
53
  }
134
- }
135
54
  ```
136
55
 
137
- これを実行すと、
56
+ エラーにな箇所は
138
- ```java
57
+ ```Java
139
- java.lang.NullPointerException: Attempt to invoke interface method 'void パッケージ名.AsyncTaskCallback.preExecute()' on a null object reference
58
+ startActivity(intent);
140
59
  ```
141
- となります。
60
+ す。
142
61
 
143
- これは、遷移後アクティビティを呼び出せいないから起こるのかなと思うのでが、
62
+ また、非同期処理では、引数resultに値は返っきておりま
144
- どこに原因があるのかがわかりません。
145
63
 
64
+ 同期処理では成功するのに、
65
+ 非同期処理でエラーが出てしまう理由がわからずに苦戦しております。
66
+
146
67
  皆様のお力添えのほど、よろしくお願い致します。