質問編集履歴

1

Handlerを使っているところを追記しました。コードは専用の記述方法に変更とは?どのようなことなのでしょうか?すみません、理解できなくて。

2016/06/10 14:33

投稿

akiba110
akiba110

スコア8

test CHANGED
File without changes
test CHANGED
@@ -108,6 +108,550 @@
108
108
 
109
109
  }
110
110
 
111
+ //Handlerを使っているところを追記
112
+
113
+ public class Http {
114
+
115
+
116
+
117
+ /**
118
+
119
+ * リクエスト情報クラス
120
+
121
+ */
122
+
123
+ public static class Request {
124
+
125
+ // リクエストURL
126
+
127
+ public String url = null;
128
+
129
+ // POSTパラメータ
130
+
131
+ public List<Param> params = new ArrayList<Param>();
132
+
133
+ // 保持オブジェクト
134
+
135
+ public Object keepObject = null;
136
+
137
+ }
138
+
139
+
140
+
141
+ /**
142
+
143
+ * レスポンス情報クラス
144
+
145
+ */
146
+
147
+ public static class Response implements Serializable {
148
+
149
+
150
+
151
+ private static final long serialVersionUID = 1L;
152
+
153
+
154
+
155
+ // HTTPレスポンスコード
156
+
157
+ public Integer code = null;
158
+
159
+ // レスポンス内容
160
+
161
+ public Object value = null;
162
+
163
+ // リクエスト時の保持オブジェクト
164
+
165
+ public Object keepObject = null;
166
+
167
+ }
168
+
169
+
170
+
171
+ /**
172
+
173
+ * POSTパラメータクラス
174
+
175
+ */
176
+
177
+ public static class Param {
178
+
179
+
180
+
181
+ public static final int TYPE_STRING = 1;
182
+
183
+ public static final int TYPE_IMAGE = 2;
184
+
185
+
186
+
187
+ private int type;
188
+
189
+ private String key;
190
+
191
+ private String value;
192
+
193
+
194
+
195
+ public Param(int type, String key, String value) {
196
+
197
+ this.type = type;
198
+
199
+ this.key = key;
200
+
201
+ this.value = value;
202
+
203
+ }
204
+
205
+ }
206
+
207
+
208
+
209
+ /**
210
+
211
+ * リクエスト実行クラス
212
+
213
+ */
214
+
215
+ private static class HttpRequest extends AsyncTask<Void, Void, Void> {
216
+
217
+
218
+
219
+ // URL文字列
220
+
221
+ private String url = null;
222
+
223
+ // POSTパラメータ
224
+
225
+ private List<Param> params = new ArrayList<Param>();
226
+
227
+ // レスポンスハンドラ
228
+
229
+ private ResponseHandlerBase handler = null;
230
+
231
+ // 保持オブジェクト
232
+
233
+ private Object keepObject = null;
234
+
235
+ // レスポンスオブジェクト
236
+
237
+ private Response ret = null;
238
+
239
+ // interruptするスレッド
240
+
241
+ private Thread interruptThread = null;
242
+
243
+
244
+
245
+ @Override
246
+
247
+ protected Void doInBackground(Void... params) {
248
+
249
+
250
+
251
+ // URI構築
252
+
253
+ URI uri = null;
254
+
255
+ try {
256
+
257
+ uri = new URI(url);
258
+
259
+ } catch (URISyntaxException e) {
260
+
261
+ e.printStackTrace();
262
+
263
+ return null;
264
+
265
+ }
266
+
267
+
268
+
269
+ // GET/POSTリクエスト作成
270
+
271
+ HttpUriRequest request;
272
+
273
+ if (this.params != null && this.params.size() > 0) {
274
+
275
+ HttpPost r = new HttpPost(uri);
276
+
277
+ //MultipartEntityBuilder entity = new MultipartEntityBuilder();
278
+
279
+ MultipartEntity entity = new MultipartEntity();
280
+
281
+ for (Param p : this.params) {
282
+
283
+ switch (p.type) {
284
+
285
+ case Param.TYPE_STRING:
286
+
287
+ // 文字パラメータの場合
288
+
289
+ try {
290
+
291
+ entity.addPart(p.key, new StringBody(p.value,
292
+
293
+ "text/plain", Charset.forName("UTF-8")));
294
+
295
+ } catch (UnsupportedEncodingException e) {
296
+
297
+ e.printStackTrace();
298
+
299
+ }
300
+
301
+ break;
302
+
303
+ case Param.TYPE_IMAGE:
304
+
305
+ // 画像パラメータの場合
306
+
307
+ entity.addPart(p.key, new FileBody(new File(p.value),
308
+
309
+ "image/jpg"));
310
+
311
+ break;
312
+
313
+ }
314
+
315
+ }
316
+
317
+ r.setEntity(entity);
318
+
319
+ //r.setEntity(MultipartEntity);//1606/08上に変更
320
+
321
+ request = r;
322
+
323
+ } else {
324
+
325
+ HttpGet r = new HttpGet(uri);
326
+
327
+ request = r;
328
+
329
+ }
330
+
331
+
332
+
333
+ // リクエストを実行
334
+
335
+ DefaultHttpClient httpClient = new DefaultHttpClient();
336
+
337
+ try {
338
+
339
+ httpClient.execute(request,
340
+
341
+ new org.apache.http.client.ResponseHandler<Void>() {
342
+
343
+
344
+
345
+ // HTTPレスポンスから,受信文字列をエンコードして文字列として返す
346
+
347
+ @Override
348
+
349
+ public Void handleResponse(HttpResponse response)
350
+
351
+ throws IOException {
352
+
353
+
354
+
355
+ if (ret == null) {
356
+
357
+ ret = new Response();
358
+
359
+ }
360
+
361
+
362
+
363
+ // ret = new Http.Response();
364
+
365
+ ret.code = response.getStatusLine()
366
+
367
+ .getStatusCode();
368
+
369
+ // 正常に受信できた場合は200
370
+
371
+ if (ret.code == 200) {
372
+
373
+ ret.value = handler
374
+
375
+ .createObjectFromResponse(response);
376
+
377
+ }
378
+
379
+
380
+
381
+ // 保持オブジェクトを継承
382
+
383
+ ret.keepObject = keepObject;
384
+
385
+
386
+
387
+ // スレッドが指定されている場合はinterrupt
388
+
389
+ if (interruptThread != null) {
390
+
391
+ interruptThread.interrupt();
392
+
393
+ }
394
+
395
+
396
+
397
+ return null;
398
+
399
+ }
400
+
401
+
402
+
403
+ });
404
+
405
+ } catch (ClientProtocolException e) {
406
+
407
+ e.printStackTrace();
408
+
409
+ } catch (IOException e) {
410
+
411
+ e.printStackTrace();
412
+
413
+ } finally {
414
+
415
+
416
+
417
+ // 通信のshutdown
418
+
419
+ if (httpClient != null) {
420
+
421
+ try {
422
+
423
+ httpClient.getConnectionManager().shutdown();
424
+
425
+ } catch (Exception e) {
426
+
427
+ e.printStackTrace();
428
+
429
+ }
430
+
431
+ }
432
+
433
+ }
434
+
435
+
436
+
437
+ return null;
438
+
439
+
440
+
441
+ }
442
+
443
+
444
+
445
+ // タスク終了時
446
+
447
+ protected void onPostExecute(Void unused) {
448
+
449
+
450
+
451
+ // 受信結果をUIに渡すためにまとめる
452
+
453
+ Message message = new Message();
454
+
455
+ Bundle bundle = new Bundle();
456
+
457
+ bundle.putSerializable("http_response", ret);
458
+
459
+ message.setData(bundle);
460
+
461
+
462
+
463
+ // 受信結果に基づいてUI操作させる
464
+
465
+ handler.sendMessage(message);
466
+
467
+ }
468
+
469
+
470
+
471
+ }
472
+
473
+
474
+
475
+ /**
476
+
477
+ * レスポンス実行ベースクラス
478
+
479
+ */
480
+
481
+ public static abstract class ResponseHandlerBase extends Handler {
482
+
483
+
484
+
485
+ // コンストラクタ
486
+
487
+ public ResponseHandlerBase() {
488
+
489
+ }
490
+
491
+
492
+
493
+ // リクエストタスク完了時にコールされる
494
+
495
+ public void handleMessage(Message msg) {
496
+
497
+ try {
498
+
499
+ onFinish((Response) msg.getData().get("http_response"));
500
+
501
+ } catch (Exception e) {
502
+
503
+ e.printStackTrace();
504
+
505
+ }
506
+
507
+ }
508
+
509
+
510
+
511
+ // レスポンス取得時にオブジェクトに変換するクラス
512
+
513
+ public abstract Object createObjectFromResponse(HttpResponse response);
514
+
515
+
516
+
517
+ // レスポンス完了時に呼ばれるクラス
518
+
519
+ public abstract void onFinish(Response response);
520
+
521
+
522
+
523
+ }
524
+
525
+
526
+
527
+ /**
528
+
529
+ * 同期リクエスト
530
+
531
+ */
532
+
533
+ public static final Response requestSync(Request request,
534
+
535
+ ResponseHandlerBase handler) {
536
+
537
+
538
+
539
+ // レスポンス格納用
540
+
541
+ Response resp = new Response();
542
+
543
+
544
+
545
+ // リクエスト構築
546
+
547
+ HttpRequest httpReq = new HttpRequest();
548
+
549
+ httpReq.url = request.url;
550
+
551
+ httpReq.handler = handler;
552
+
553
+ if (request.params != null) {
554
+
555
+ httpReq.params.addAll(request.params);
556
+
557
+ }
558
+
559
+ httpReq.keepObject = request.keepObject;
560
+
561
+ httpReq.ret = resp;
562
+
563
+ httpReq.interruptThread = Thread.currentThread();
564
+
565
+
566
+
567
+ // リクエスト実行
568
+
569
+ httpReq.execute();
570
+
571
+
572
+
573
+ // レスポンスが返るまで待機
574
+
575
+ while (true) {
576
+
577
+ try {
578
+
579
+ Thread.sleep(10000);
580
+
581
+ } catch (InterruptedException e) {
582
+
583
+ // レスポンスが返った
584
+
585
+ break;
586
+
587
+ }
588
+
589
+ }
590
+
591
+
592
+
593
+ // レスポンスを返す
594
+
595
+ return resp;
596
+
597
+ }
598
+
599
+
600
+
601
+ /**
602
+
603
+ * 非同期リクエスト
604
+
605
+ */
606
+
607
+ public static final void request(Request request,
608
+
609
+ ResponseHandlerBase handler) {
610
+
611
+
612
+
613
+ // リクエスト構築
614
+
615
+ HttpRequest httpReq = new HttpRequest();
616
+
617
+ httpReq.url = request.url;
618
+
619
+ httpReq.handler = handler;
620
+
621
+ if (request.params != null) {
622
+
623
+ httpReq.params.addAll(request.params);
624
+
625
+ }
626
+
627
+ httpReq.keepObject = request.keepObject;
628
+
629
+ httpReq.ret = null;
630
+
631
+ httpReq.interruptThread = null;
632
+
633
+
634
+
635
+ // リクエスト実行
636
+
637
+ httpReq.execute();
638
+
639
+ }
640
+
641
+
642
+
643
+ }
644
+
645
+
646
+
647
+ //2) コードは専用の記述方法に変更・・・ と専用の記述方法に変更とはどのようにすればいいのでしょうか・・・?
648
+
649
+
650
+
651
+
652
+
653
+
654
+
111
655
  ###試したこと
112
656
 
113
657
  課題に対してアプローチしたことを記載してください