Symfoware

Symfowareについての考察blog

Android ネットワークライブラリ「Volley」を使用してJSONデータ取得

生のhttpconnectionとAsyncTaskLoaderを使用してJSONデータを取得してみました。
Android http経由でのデータ取得とJSONデータの解析

結構つらい。



Volley



これ、うまく書かないとコールバックの嵐になりそうだなと思っていたところ
Androidの開発におけるベストプラクティス

Volleyという通信ライブラリを知りました。
https://github.com/google/volley
Volley 基礎 (Android アプリ用ネットワークライブラリ)
ネットワーク通信用ライブラリVOLLEYを使いこなす


公式にチュートリアルもあるようです。
Transmitting Network Data Using Volley

前回作ったプログラムの通信部分をVolleyに変更してみます。






gradleの設定



ドキュメントにあるように、gradleの設定ファイルを編集します。

771_01.png

dependencies(依存関係)の項目に1行追加。


compile 'com.android.volley:volley:1.0.0'




build.gradleはこのようになりました。


  1. apply plugin: 'com.android.application'
  2. android {
  3.     compileSdkVersion 26
  4.     buildToolsVersion "26.0.1"
  5.     defaultConfig {
  6.         applicationId "com.example.baranche.myapplication"
  7.         minSdkVersion 15
  8.         targetSdkVersion 26
  9.         versionCode 1
  10.         versionName "1.0"
  11.         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  12.     }
  13.     buildTypes {
  14.         release {
  15.             minifyEnabled false
  16.             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  17.         }
  18.     }
  19. }
  20. dependencies {
  21.     compile fileTree(dir: 'libs', include: ['*.jar'])
  22.     androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
  23.         exclude group: 'com.android.support', module: 'support-annotations'
  24.     })
  25.     compile 'com.android.support:appcompat-v7:26.+'
  26.     compile 'com.android.support.constraint:constraint-layout:1.0.2'
  27.     compile 'com.android.volley:volley:1.0.0'
  28.     testCompile 'junit:junit:4.12'
  29. }







プログラムの変更



Sending a Simple Request
ここを見ながらプログラムを修正しました。

ちょっとハマったのは、取得した文字列がutf8ではなかったことでしょうか。
こちらを参考に、文字コードを変換しています。
Fail with UTF-8 encoding in Volley Requests


・MainActivity.java


  1. import android.graphics.Bitmap;
  2. import android.graphics.BitmapFactory;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.widget.ListView;
  7. import com.android.volley.Request;
  8. import com.android.volley.RequestQueue;
  9. import com.android.volley.Response;
  10. import com.android.volley.VolleyError;
  11. import com.android.volley.toolbox.StringRequest;
  12. import com.android.volley.toolbox.Volley;
  13. import org.json.JSONArray;
  14. import org.json.JSONObject;
  15. import java.net.URLDecoder;
  16. import java.net.URLEncoder;
  17. import java.util.ArrayList;
  18. public class MainActivity extends AppCompatActivity {
  19.     private ArrayList<ListRow> mListItems;
  20.     private MyAdapter mAdapter;
  21.     private static final int LOADER_ID = 1;
  22.     private static final String ARG_URL_PARAM = "ARG_URL_PARAM";
  23.     @Override
  24.     protected void onCreate(Bundle savedInstanceState) {
  25.         super.onCreate(savedInstanceState);
  26.         setContentView(R.layout.activity_main);
  27.         // リストに表示するデータ
  28.         mListItems = new ArrayList<>();
  29.         // MyAdapterを作成し、データを設定
  30.         mAdapter = new MyAdapter(this, R.layout.list_layout, mListItems);
  31.         // ListViewにArrayAdapterを関連付け、データの表示を行う
  32.         ListView listView = (ListView) findViewById(R.id.listView1);
  33.         listView.setAdapter(mAdapter);
  34.     }
  35.     public void readJson(View view) {
  36.         mListItems.clear();
  37.         // Instantiate the RequestQueue.
  38.         RequestQueue queue = Volley.newRequestQueue(this);
  39.         String url = "http://192.168.1.4:8000/sample.json";
  40.         // Request a string response from the provided URL.
  41.         StringRequest stringRequest = new StringRequest(
  42.             Request.Method.GET, url,
  43.             new Response.Listener<String>() {
  44.                 @Override
  45.                 public void onResponse(String response) {
  46.                     // ローダーが取得した文字列を解析して表示
  47.                     try {
  48.                         // 文字コードを変換
  49.                         String jsonString = URLDecoder.decode(URLEncoder.encode(response, "iso8859-1"),"UTF-8");
  50.                         // JSONな文字列をオブジェクトに変換
  51.                         JSONObject json = new JSONObject(jsonString);
  52.                         // "rows"の項目を取得し、ループ
  53.                         JSONArray rows = json.getJSONArray("rows");
  54.                         for (int i = 0; i < rows.length(); i++) {
  55.                             // titleを取得
  56.                             JSONObject row = rows.getJSONObject(i);
  57.                             String title = row.getString("title");
  58.                             Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_suiginto);
  59.                             ListRow item = new ListRow(bmp, title);
  60.                             mListItems.add(item);
  61.                         }
  62.                     } catch (Exception e) {
  63.                         e.printStackTrace();
  64.                     }
  65.                     mAdapter.notifyDataSetChanged();
  66.                 }
  67.             },
  68.             new Response.ErrorListener() {
  69.                 @Override
  70.                 public void onErrorResponse(VolleyError error) {
  71.                     System.out.println(error.getMessage());
  72.                 }
  73.             }
  74.         );
  75.         // Add the request to the RequestQueue.
  76.         queue.add(stringRequest);
  77.     }
  78. }




実行結果

771_02.png




Making a Standard Request



先程は文字列を受け取りJSONObjectに自分で変換していましたが、
戻り値がJSONObjectとなる処理も用意されていました。
Making a Standard Request

プログラムを変更してみます。


  1. import android.graphics.Bitmap;
  2. import android.graphics.BitmapFactory;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.widget.ListView;
  7. import com.android.volley.Request;
  8. import com.android.volley.RequestQueue;
  9. import com.android.volley.Response;
  10. import com.android.volley.VolleyError;
  11. import com.android.volley.toolbox.JsonObjectRequest;
  12. import com.android.volley.toolbox.Volley;
  13. import org.json.JSONArray;
  14. import org.json.JSONException;
  15. import org.json.JSONObject;
  16. import java.util.ArrayList;
  17. public class MainActivity extends AppCompatActivity {
  18.     private ArrayList<ListRow> mListItems;
  19.     private MyAdapter mAdapter;
  20.     private static final int LOADER_ID = 1;
  21.     private static final String ARG_URL_PARAM = "ARG_URL_PARAM";
  22.     @Override
  23.     protected void onCreate(Bundle savedInstanceState) {
  24.         super.onCreate(savedInstanceState);
  25.         setContentView(R.layout.activity_main);
  26.         // リストに表示するデータ
  27.         mListItems = new ArrayList<>();
  28.         // MyAdapterを作成し、データを設定
  29.         mAdapter = new MyAdapter(this, R.layout.list_layout, mListItems);
  30.         // ListViewにArrayAdapterを関連付け、データの表示を行う
  31.         ListView listView = (ListView) findViewById(R.id.listView1);
  32.         listView.setAdapter(mAdapter);
  33.     }
  34.     public void readJson(View view) {
  35.         mListItems.clear();
  36.         // Instantiate the RequestQueue.
  37.         RequestQueue queue = Volley.newRequestQueue(this);
  38.         String url = "http://192.168.1.4:8000/sample.json";
  39.         // Request a string response from the provided URL.
  40.         JsonObjectRequest jsObjRequest = new JsonObjectRequest(
  41.             Request.Method.GET, url, null,
  42.             new Response.Listener<JSONObject>() {
  43.                 @Override
  44.                 public void onResponse(JSONObject response) {
  45.                     try {
  46.                         // "rows"の項目を取得し、ループ
  47.                         JSONArray rows = response.getJSONArray("rows");
  48.                         for (int i = 0; i < rows.length(); i++) {
  49.                             // titleを取得
  50.                             JSONObject row = rows.getJSONObject(i);
  51.                             String title = row.getString("title");
  52.                             Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_suiginto);
  53.                             ListRow item = new ListRow(bmp, title);
  54.                             mListItems.add(item);
  55.                         }
  56.                     } catch (JSONException e) {
  57.                         e.printStackTrace();
  58.                     }
  59.                     mAdapter.notifyDataSetChanged();
  60.                 }
  61.             },
  62.             new Response.ErrorListener() {
  63.                 @Override
  64.                 public void onErrorResponse(VolleyError error) {
  65.                     System.out.println(error.getMessage());
  66.                 }
  67.             }
  68.         );
  69.         // Add the request to the RequestQueue.
  70.         queue.add(jsObjRequest);
  71.     }
  72. }




実行結果は変わりません。

Volley、キャッシュや通信のキャンセルも行えるようで。
自分で通信処理を実装するより楽できそうです。



【参考URL】

Androidの開発におけるベストプラクティス
https://github.com/google/volley
Volley 基礎 (Android アプリ用ネットワークライブラリ)
ネットワーク通信用ライブラリVOLLEYを使いこなす
Transmitting Network Data Using Volley

関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/08/12(土) 19:24:00|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Android ネットワークライブラリ「Volley」を使用して画像データ取得 | ホーム | Android http経由でのデータ取得とJSONデータの解析>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/2024-10d0aaa3
この記事にトラックバックする(FC2ブログユーザー)