2013年9月10日火曜日

Volleyを使ってみる(JsonArrayRequest、JsonObjectRequest編)

今回は、Volleyを使ってJSON形式のデータを取得したいと思います(`・ω・´)シャキーン
JSONデータを扱うようとして次の3種類があるみたいです。

・JsonRequest(抽象クラス)
・JsonArrayRequest
・JsonObjectRequest

JsonRequestは抽象クラスみたいなので、とりあえずおいておいてJsonArrayRequestを試してみたいと思います。

■JsonArrayRequestの利用方法

JsonArrayRequestはレスポンス結果がJSON形式の配列の場合に利用します。

まずはレスポンス側のPHPプログラムとして次のようなものを利用します(`・ω・´)シャキーン
<?
header("Content-Type: text/javascript; charset=utf-8");
echo( "[1,2,3,4,5,6,7,8,9,0]" );
exit(0);
?>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.volleyexample3"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="8" />

    <!-- インターネットへのアクセスを許可 -->
    <uses-permission android:name="android.permission.INTERNET"/>    
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.volleyexample3.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

</RelativeLayout>
MainActivity.java
package com.example.volleyexample3;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.widget.Toast;

import com.android.volley.Request.Method;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.Response.Listener;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

public class MainActivity extends Activity {

 //ログ出力時のタグ名
 private static final String TAG_LOG = "Log";
 //Volleyでリクエスト時に設定するタグ名。キャンセル時に利用する。
 private static final Object TAG_REQUEST_QUEUE = new Object();
 //画像のURL
 private static final String REQUEST_URL_REQUEST_JSON_ARRAY = "HTTPリクエストURL";
 //RequestQueueのインスタンス用
 private RequestQueue mRequestQueue;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  //RequestQueueのインスタンス用を取得
  mRequestQueue = Volley.newRequestQueue(getApplicationContext());

 }
 /*
  * onCreateの後に呼び出される。
  */
 @Override
 public void onStart(){
  super.onStart();
  //
  requestJsonArray();
 }
 
 /*
  * アプリが見えなくなったときに呼び出される。
  * (他のアプリを立ち上げたりした時など)
  */
 @Override
 public void onStop(){
  super.onStop();
  mRequestQueue.cancelAll(TAG_REQUEST_QUEUE);
 }
 
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }
 /*
  * HTTPリクエストを投げる(JSONArray)
  */
 private void requestJsonArray(){
  
  // リクエストを投げる
  JsonArrayRequest request = new JsonArrayRequest(
   REQUEST_URL_REQUEST_JSON_ARRAY,
   new Response.Listener<JSONArray>(){
    @Override 
    public void onResponse(JSONArray response) {
     
     int length = response.length();
     
     //レスポンス受け取り時の処理
     if (length <= 0){
      //空の場合
      return;
     }
     
     for(int i = 0; i < length; i++){
      try {
       Integer value = (Integer)response.get(i);
       Log.d(TAG_LOG, value.toString());
      } catch (JSONException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
     }
     
     //
     Toast.makeText(getApplicationContext(), response.toString(), Toast.LENGTH_LONG).show();
     
    }
   },
   new Response.ErrorListener() {
    @Override 
    public void onErrorResponse(VolleyError error) {
     
     //エラー時の処理
     Toast.makeText(getApplicationContext(), "onErrorResponse", Toast.LENGTH_LONG).show();
     
    }
   }
  );
  //タグを設定する
  request.setTag(TAG_REQUEST_QUEUE);
  
  //リクエスト&レスポンス情報の設定を追加
  mRequestQueue.add(request);

  //リクエスト開始
  mRequestQueue.start(); 
  
 }

}
次のように表示されれば問題ありません( ´∀`)bグッ!

■JsonObjectRequestの利用方法

JsonObjectRequestはレスポンス結果がJSON形式のオブジェクトの場合に利用します。
(PHPなどでは連想配列などのことを指す)

レスポンス側のPHPプログラムとして次のようなものを利用します(`・ω・´)シャキーン
<?
header("Content-Type: text/javascript; charset=utf-8");
echo( '{"test1":1,"test2":2,"test3":3}{"test1":1,"test2":2,"test3":3}' );
exit(0);
?>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.volleyexample3"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="8" />

    <!-- インターネットへのアクセスを許可 -->
    <uses-permission android:name="android.permission.INTERNET"/>    
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.volleyexample3.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

</RelativeLayout>
MainActivity.java
package com.example.volleyexample3;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.widget.Toast;

import com.android.volley.Request.Method;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.Response.Listener;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

public class MainActivity extends Activity {

 //ログ出力時のタグ名
 private static final String TAG_LOG = "Log";
 //Volleyでリクエスト時に設定するタグ名。キャンセル時に利用する。
 private static final Object TAG_REQUEST_QUEUE = new Object();
 //画像のURL
 private static final String REQUEST_URL_REQUEST_JSON_OBJECT = "HTTPリクエストURL";
 //RequestQueueのインスタンス用
 private RequestQueue mRequestQueue;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  //RequestQueueのインスタンス用を取得
  mRequestQueue = Volley.newRequestQueue(getApplicationContext());

 }
 /*
  * onCreateの後に呼び出される。
  */
 @Override
 public void onStart(){
  super.onStart();
  //
  requestJsonObject();
 }
 
 /*
  * アプリが見えなくなったときに呼び出される。
  * (他のアプリを立ち上げたりした時など)
  */
 @Override
 public void onStop(){
  super.onStop();
  mRequestQueue.cancelAll(TAG_REQUEST_QUEUE);
 }
 
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }
 /*
  * HTTPリクエストを投げる(JSONObject)
  */
 private void requestJsonObject(){
  
  // リクエストを投げる
  JsonObjectRequest request = new JsonObjectRequest(
   //GETのみ?
   Method.GET,
   //リクエスト先
   REQUEST_URL_REQUEST_JSON_OBJECT,
   //リクエストパラメータ
   null,
   //レスポンス時のリスナー
   new Listener<JSONObject>() {
    @Override 
    public void onResponse(JSONObject response) {
     
     //レスポンス受け取り時の処理
     if (response.toString() == ""){
      //空の場合
      return;
     }
     
     String message = null;
     
     try {
      message = (String) response.getString("test1");
     } catch (JSONException e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
     }
     //
     Log.d(TAG_LOG, "response : " + message);
     
     //
     Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();

    }
   },
   //エラー時のリスナー
   new Response.ErrorListener() {
    @Override 
    public void onErrorResponse(VolleyError error) {
     
     //エラー時の処理
     Toast.makeText(getApplicationContext(), "onErrorResponse", Toast.LENGTH_LONG).show();
     
    }
   }
  );
  //タグを設定する
  request.setTag(TAG_REQUEST_QUEUE);
  
  //リクエスト&レスポンス情報の設定を追加
  mRequestQueue.add(request);

  //リクエスト開始
  mRequestQueue.start(); 
  
 }

}
次のように表示されれば問題ありません( ´∀`)bグッ!

以上です(`・ω・´)ゞビシッ!!

0 件のコメント:

コメントを投稿