ビッグになります。Re:born

ビッグになるよー

AndroidでHTTP通信して自作APIから値を取得する

経緯

AndroidでHTTP通信して自作APIから値を取得してみたメモ

参考

qiita.com

コピペする

そのまま何も考えずコピペ。ただし、1ファイルずつ https://github.com/suzukaze/RxAndroidSample

1.MainActivity.java

赤文字がいっぱい。一旦無視する。

2.res

  • layout/activity_main.xml 問題なさ気
  • menu/menu_main.xml stringのresだけ赤字。スルー
  • values/.. 問題なさ気

3.AndroidManifest.xml

ユーザー認証追加。問題なさ気。

4.api,modelディレクトリ追加

  • api/ServiceGenerator.java 赤文字いっぱい。
  • api/EmpitomeBeamService.java 赤文字いっぱい。
  • model/EpitomeBeam.java 赤文字いっぱい。
  • model/EpitomeEntry.java 赤文字いっぱい。

# import部分を調整してみる

  • package名が入ってるとこは com.ksyunnnn.apitest に     全体的に赤文字は減った

5.build.gradle

  • app/build.gradle dependencies{}のみ追加してみる

一旦sync... 赤文字には関係ないのか…。

違った

ただのsyncじゃなく、 「sync with project gradle」を使わないとgradleの同期はしてなかった模様

同期したら赤文字なくなった!

動いた!

記事を理解する

通信部分をRxAndroidを使用して、リクエストし、レスポンスをパース後にUI操作の流れをわかりやすく記述する。リクエストについてはRetrofitによりRESTfulに記述し、Gsonによるレスポンスをパースした結果を定義することにより、面倒なパースを自動的にパースします。

出てきた単語 * RxAndroid => リクエスト,レスポンス * Gson => パース * Retrofit

RxAndroid

非同期通信をうまくなんやするライブラリ パース(構文解析)も行っている?

dependencies {
        compile 'io.reactivex:rxandroid:0.24.0'
        compile 'io.reactivex:rxjava:1.0.8'
        }

GSON

JSONデータとJavaオブジェクトを相互に変換するためのライブラリ

dependencies {
        ??? // compileなしでなぜかいけてる…
        }

Retrofit

インターフェースの定義のために必要そうなもの?

dependencies {
        compile 'com.squareup.retrofit:retrofit:1.9.0'
        }

OkHTTP

※文中にはないけど使ってる模様 HTTPクライアントのライブラリ。WebSocketに対応していて、同期/非同期のAPIを提供。

dependencies {
        compile 'com.squareup.okhttp:okhttp:2.3.0'
        }

脳みそ整理

構造を見ていく

RxAndroidによる通信

(1)リクエストしてレスポンスをパース(構文解析) subscribeOn(Schedulers.io())により、io用のスレッドで行う設定

(2)結果を受け取りUI操作 observeOn(AndroidSchedulers.mainThread())によりメインスレッドで行う設定

やんわりOKということにする

WebAPIを作ってみる

php

$resposnse = array(
        "user" => "俺",
        "id" => "hoge"
);
json_encode($response);

で簡単に解決 json形式で吐き出した。

アプリから取得する

できない

できない理由

teratail.com

オブジェクトでパースしようとしてるのに 配列で返してるのがダメな原因らしい

結果

配列では受け取れないが、単体のオブジェクトとしては受け取れたので一旦良しとする。

ソースは下記の質問ページに記載してるので、ご参考に teratail.com