TEST - みる会図書館


検索対象: 出かけよう、Android !
13件見つかりました。

1. 出かけよう、Android !

第 4 章ネットワークプログラミング D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST 1371 ) : 1371 ) : 1371 ) : ( 1371 ) : 1371 ) : 1371 ) : 1371 ) : 1371 ) : 1371 ) : 1371 ) : 1371 ) : 1371 ) : 1371 ) : 1371 ) : 1371 ) : 1371 ) : 1371 ) : 1371 ) : 1371 ) : 1371 ) : 1371 ) : 1371 ) : 1371 ) : 1371 ) : 1371 ) : く /html> く /body> く hl > He110 , tomorrow! ! く / hl > く body> く /head> く meta charset="UTF-8" / > く title>tomorrowkey GitHub page く /title> く head> く html lang="j a"> く ! DOCTYPE html> く html> Vary : Accept-Encoding 1371 ) : X-Timer: S1404131042.773465872 , VSO , VE174 X-Cache-Hits: 0 X-Cache : MISS X-Served-By: cache-ty66-TYO Connection: keep-alive Age : 3409 Via: 1 . 1 varnish Date: Mon, 30 Jun 2014 12 : 24 : 02 GMT Accept-Ranges : bytes Content-Length: 169 Cache-Contr01 : max-age=600 Expires: Mon, 30 Jun 2014 11 : 37 : 13 GMT Last-Modified: Mon, 02 Jan 2012 05 : 54 : 49 GMT HTTP レスポンスの header と body 両方が出力されました。 Socket で通信す る場合はこの文字列を Java のオプジェクトに変換する処理が必要です。 Socket 通信はリクエストを自分で組み立てないといけなかったり、レスポンスが生デー タのままなので大変ですが、とても自由度が高いのが特徴です。 4.11 HttpURLConnection Socket ではリクエストを自分で組み立てなければなりませんで したが、 HTTP/HTTPS にアクセスする場合もっと便利なクラスが あります。それが HttpURLConnection です。それでは先ほどと同様 http://tomorrowkey.github.io にアクセスしてみましよう ( リスト 4.17 ) 。 リスト 4.17 : HttpURLConnection の実装方法 try { URL url = new URL("http://tomorrowkey ・ github. io ” ) ; HttpURLConnection connection = (HttpURLConnection) url . openConnection ( ) ; 92

2. 出かけよう、Android !

4.11 HttpURLConnection String contentLength = connection. getHeaderFie1d( "Content-Length" ) ; Log. d( ” TEST ” , ” Content-Length=" + contentLength) ; connection. getHeaderFie1d("Content-Type") ; String contentType Log. d("TEST" ” = ”十 contentType) ; contentType レスポンスボディを取得する場合、 getInputStream() メソッドを呼びます ( リ 実行結果は次のとおりです ( リスト 4.25 ) 。 4.11.3 実行結果 めメソッド化しています。 InputStream から文字列に変換する処理は Socket と同じなので、効率化のた "body=" + body) ; Log. d("TEST" String bOdy = readToEnd (inputStream) ; lnputStream inputStream = connection. getInputStream() ; リスト 4.24 : レスポンスボディの取得 スト 4.24 ) 。 リスト 4.25 : HttpURLConnection を使ったリクエストのレスポンス D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST 1231 ) : 1231 ) : 1231 ) : ( 1231 ) : 1231 ) : 1231 ) : 1231 ) : 1231 ) : 1231 ) : 1231 ) : 1231 ) : 1231 ) : 1231 ) : 1231 ) : responseC0de=200 Content-Length=nu11 contentType=text/htm1 ; body= く html> く ! DOCTYPE html> く html lang="j a"> く head> charset=utf-8 く title>tomorrowkey GitHub page く /title> く meta charset="UTF-8't / > く /head> く body> く hl > He110 , tomorrow! ! く / hl > く /body> く /html> Socket とは異なり HTTP プロトコルを楽に使えるようなメソッドが用意され 95

3. 出かけよう、Android !

4.13 ライプラリを使ったネットワーク通信 リスト 4.35 : HttpClient を使ったリクエストのレスポンス D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST D/TEST 4.13 1295 ) : 1295 ) : 1295 ) : 1295 ) : 1295 ) : 1295 ) : 1295 ) : 1295 ) : 1295 ) : 1295 ) : 1295 ) : 1295 ) : 1295 ) : 1295 ) : Status-Code=200 Content-Length=169 Content-Type=text/htm1 ; く html> く ! DOCTYPE html> く html lang= ” j a"> く head> charset=utf-8 く title>tomorrowkey GitHub page く /title> く meta charset="UTF-8" / > く /head> く body> く hl > He110 , tomorrow! ! く / hl > く /body> く / html > ライプラリを使ったネットワーク通信 ネットワーク通信をする度に AsyncTask を継承して、同じようなバックグラ ウンド処理を書くのは大変です。バックグラウンド処理を毎回書かなくてもい いようなライプラリが GoogIe から公開されています。名前は VoIIey*3 といい ます。 VoIIey は他のライプラリのように jar ファイルが公開されておらず、また利用 が容易な mavenrepository にホスティングもされていません。 AOSP でソース コードが管理されているので、そこから jar ファイルを作る必要があります。次 のコマンドを実行することで jar ファイルをビルドできます ( リスト 4.36 ) 。 リスト 4.36 : Volley のビルド git clone https ://android.googlesource.com/platform/frameworks/volley きるようにしましよう。 生成された jar ファイルを libs ディレクトリに人れてソースコードから参照で ant j ar cd volley 99 、 3 https://android.googlesource.com/platform/frameworks/volley/

4. 出かけよう、Android !

第 4 章ネットワークプログラミング リスト 4.41 : 工ラー系レスポンスリスナー @Override public void onErrorResponse (V011eyError volley&ror) { NetworkResponse networkResponse = v011eyError. networkResponse ; int statusCode = networkResponse . statusCode ; "Status-Code= ” + statusCode) ; Log. d("TEST" string contentLength = networkResponse. headers. get ("Content-Length") ; "Content-Length= ” + contentLength) ; Log. d("TEST" String body = new String (networkResponse. data) ; Log. d("TEST ” , b0dy) ; 1654 ) : 1654 ) : 1654 ) : 1654 ) : リスト 4.42 : ェラーレスポンス D/TEST D/TEST D/TEST D/TEST Status-Code=404 Content-Length=9 Content-Type=nu11 Not Found volley を使うと非同期処理を書かなくてよいのでとても便利ですね。このよ うなライプラリを使うと独自で実装するよりも手間が省けます。その一方、実 装の自由度は低くなりがちなことを覚えておくとよいでしよう。とはいっても、 一般的なネットワーク通信において、 volley のようなライプラリは非常に有用 です。 4.14 WebAPI にアクセスする 各種オンラインサービスは Application programming Interface(API) を公開 していることがあります。たとえば Twitter の API を使うと、自分だけのオリ ジナルの rnvitter アプリを作ることができます。また天気予報サービスの API を使えば、自分好みの天気予報アプリを作れます。 本節では、 WebAPI を使う上で気をつけなければならないことを挙げて解説 します。 102

5. 出かけよう、Android !

GET HTTP/I.1 H ost : 4.10 ソケットプログラミング 表 4.1 GET リクエスト 1 行目 ファイルを取得する " / " というファイルを取得する HTTP/I.1 というプロトコル ( 手続き方法 ) を使います 表 4.2 GET リクエスト 2 行目 ヘッダのキーです tomorrowkey. github. io Host キーはリクエスト先のホスト名を指定します 4.10.3 レスポンスを受け取る socket から InputStream を取得して HTTP レスポンスを取得します ( リス ト 4.15 ) 。 リスト 4.15 : レスポンスの取得 InputStream inputStream = socket . getInputStream() ; byte ロ buffer = new byte [ 1024 ] ; int length; while ((length = inputStream. read(buffer)) ! = Log. d("TEST" , new String(buffer, 0 , length)) ; レスポンスの取得まで完了したら InputStream と OutputStream の close メ ソッドを呼んで Stream を閉じましよう。 4.10.4 実行結果 実行すると logcat にレスポンスが出力されます ( リスト 4.16 ) 。 リスト 4.16 : Socket を使ったリクエストのレスポンス D/TEST D/TEST D/TEST 1371 ) : 1371 ) : 1371 ) : HTTP/I . 1 200 OK Server: GitHub . com Content-Type : text/html ; charset=utf-8

6. 出かけよう、Android !

4.11 HttpURLConnection connection. setRequestMethod("GET") ; connection. setRequestProperty ("Host ” connection. connect ( ) ; connection. getResponseCode() ; int responseCode Log. d("TEST" responseCode= ”十 responseC0de) ; String contentLength = connection. getHeaderFie1d("Content-Length") ; Log. d("TEST ”” Content -Length=" + contentLength) ; String contentType = connection. getHeaderFie1d("Content-Type't) ; Log. d("TEST" ” contentType=" 十 contentType) ; lnputStream inputStream = connection. getInputStream() ; String body = readTOEnd (inputStream) ; Log. d("TEST" , "body=" + body) ; inputStream. close ( ) ; } catch (Ma1formedURLException e) { throw new RuntimeException(e) ; } catch (IOException e) { throw new RuntimeException(e) ; "tomorrovkey. github. iO ” ) ; HttpURLConnection では、 どのような処理をしているか順番に見ていきま 4.11.1 リクエストを送信する アクセスする URL を使い URL オプジェクトを作ります ( リスト 4.18 ) 。 リスト 4.18 : URL オプジェクトの生成 URL url = new URL("http://tomorrowkey.github.io ” ) ; openConnection() メソッドを使い、 HttpURLConnection を取得します ( リ スト 4.19 ) 。 リスト 4.19 : HTTPUrlConnection の取得 HttpURLConnection connection = (HttpURLConnection) url. openConnection() ; 注意点として、 URL. openConnection() メソッドの戻り値は URLConnection 93

7. 出かけよう、Android !

第 4 章ネットワークプログラミング 98 実行結果は次のとおりです ( リスト 4.35 ) 。 4.12.3 実行結果 すね。 リクエストとレスポンスのオプジェクトが分かれているので分かりやすいで inputStream. close ( ) ; Log. d("TEST", body); String b0dy = readTOEnd(inputStream) ; InputStream inputStream = httpResponse.getEntity() . getContent() ; リスト 4.34 : レスポンスボディの取得 スト 4.34 ) 。 レスポンスボディを取得する場合、 getInputStream() メソッドを呼びます ( リ Log. d("TEST" "Content-Type=" + contentTypeHeader. getVa1ue ( ) ) ; Header contentTypeHeader = httpResponse . getFirstHeader ( "Content-Type ” ) ; Log. d("TEST ” , "Content-Length=" + contentLengthHeader. getVa1ue() ) ; Header contentLengthHeader = httpResponse.getFirstHeader ( "Content-Length" ) ; リスト 4.33 : ヘッダーの取得 ソッドを呼びます ( リスト 4.33 ) 。 ジェクトを取得します。 Header オプジェクトの値を取得するには getVaIue ( ) メ レスポンスへッダを取得するには、 getFirstHeader() メソッドで Header オプ HTTP/I . 1 200 OK リスト 4.32 : ステータスライン 4.32 ) 。 ステータスラインとは HTTP レスポンスの次の部分を指します ( リスト

8. 出かけよう、Android !

method ur 1 requestBody listener errorListener 4.13 ライプラリを使ったネットワーク通信 表 4.3 GET リクエスト 2 行目 リクエストメソッドを指定する アクセスする URL を指定する 工ラーレスポンスリスナー レスポンスリスナー リクエスト時にボディに送る JSONObject を指定する 299 以外 ) の場合に実行されます。 リクエストをリクエストキューに追加すると自動的にバックグラウンドでネッ トワーク通信が行われ、ネットワーク通信が完了すると引数に渡したコールバッ ク (listener 、 errorListener) が実行されます。 4.13.2 レスポンス サーバーのレスポンスが正常系 ( 200 ~ 299 ) だった場合、第 4 引数の listener の コールバックメソッドが実行されます。レスポンスボディは自動的に JSONOb ー ject にパースされ、引数に渡されます ( リスト 4.39 、リスト 4.40 ) 。 リスト 4.39 : 正常系レスポンスリスナー @Override public void onResponse (JSONObj ect j sonObj ect) { Log. d("TEST", json0bject. t0String()); リスト 4.40 : 正常系なレスポンス D/TEST ( 1699 ) : {"users": [ { ” id ” : 1 {"id":2,"gender":"ma1e ” ,"name":"bob"}]} サーバのレスポンスが異常系 ( 200 ~ 299 以外 ) だった場合、第 5 引数の er ー rorListener のコールバックメソッドが実行されます。工ラーの内容は引数の VoIIeyError オプジェクトに人っています ( リスト 4.41 、リスト 4.42 ) 。 川 1

9. 出かけよう、Android !

第 4 章ネットワークプログラミング 実際には静的ファイルなのですが、 JSON ファイルを取得することで API ァ クセスする時のコードを実装しましよう ( リスト 4.37 ) 。 リスト 4.37 : API アクセス mRequestQueue = V011ey. newRequestQueue (getApp1icationContext ( ) ) ; int method = Request . Method. GET ; "https: //raw ・ githubusercontent . com/TechBooster/ String url Andr0idOpenTextb00k/master/code/network/assets/samp1e ・ j so Ⅱ” JSONObject requestB0dy = Ⅱ u11 ; リクエストキューを生成したので、リクエストを追加します。リクエストを追 mRequestQueue = V011ey. newRequestQueue (getApp1icationContext ( ) ) ; リスト 4.38 : リクエストキューの生成 す。リトライ処理についてもある程度行ってくれます ( リスト 4.38 ) 。 工ストを追加することで、自動的にバックグラウンドで随時リクエストを送りま まずはリクエストキューを作ります。この作成されたリクエストキューにリク 4.13.1 リクエストを送信する url, requestBody, listener, errorListener) ) ; mRequestQueue. add (new JsonObj ectRequest (method , Log. d("TEST", message); String message = v011eyError. getMessage() ; public void onErrorResponse (V011eyError v011eyError) { @Override Response . ErrorListener errorListener = new Response. ErrorListener() { Log. d("TEST", jsonObject. tOString()); public void onResponse (JSONObject jsonObject) { @Override Response . Listener く JSONObject> listener = new Response . Listener く JSONObject>() { 100 されます。またエラーレスポンスリスナーは異常系のステータスコード ( 200 ~ レスポンスリスナーは、正常系のステータスコード ( 200 ~ 299 ) の場合に実行 加する際には次のパラメータが必要です ( 表 4.3 ) 。

10. 出かけよう、Android !

4.12 HttpCIient (Apache Http) ヘッダの指定は addHeader メソッドを使います ( リスト 4.28 ) 。 リスト 4.28 : ヘッダーの追加 httpGet . addHeader("Host" "tomorrowkey. github. iO") ; 実際に通信を行うのは HttpClient というオプジェクトなので、 HttpClient を 生成します。今回は DefaultHttpClient を使って HttpClient を生成しています が、 AndroidHttpCIient を使うこともできます ( リスト 4.29 ) 。 リスト 4.29 : HttpClient の生成 HttpC1ient httpC1ient = new Defau1tHttpC1ient ( ) ; 生成した httpCIient の execute() メソッドにリクエストオプジェクト (httpGet) を渡すことで通信をします ( リスト 4.30 ) 。 リスト 4.30 : HttpClient を使った通信 HttpResponse httpResponse = httpC1ient.execute(httpGet) ; 通信したレスポンスは HttpResponse というクラスで戻り値に返ってきます。 4.12.2 レスポンスを受け取る ステータスコードを取得するには、まずは getStatusLine() メソッドでステー タスラインを取得した後に、 getStatusCode() メソッドを呼びます ( リスト 4.31) 。 リスト 4.31 : ステータスコードの取得 StatusLine statusLine = httpResponse . getStatusLine() ; Log. d("TEST't "Status-C0de=" + statusLine. getStatusCode() ) ; 97