2013年9月6日金曜日

Volleyを使ってみる(StringRequest編)

前回の記事「Volleyを使ってみる。(ダウンロード&設定) 」からの続きになります。
前回の記事でVolleyを使うための設定が終わったので、今度は実際に使ってみたいと思います+(0゚・∀・) + ワクテカ +

Volleyで実際にリクエストを投げるには、
リクエスト情報とレスポンス情報を前もって作っておき、
それをVolleyに渡してあげる事で実際にリクエストされるみたいです。

リクエスト情報とレスポンス情報を扱うのに、次のクラスが用意されているそうです。
Volley 基礎 (Android アプリ用ネットワークライブラリ)
・StringRequest クラス
・ImageRequest クラス
・JsonRequest クラス (抽象クラス)
・JsonArrayRequest クラス
・JsonObjectRequest クラス
・ClearCacheRequest クラス

受け取りたいレスポンス結果ごとにクラスが分かれているみたいです。

今回はこの中のStringRequestクラスを利用して、文字列のレスポンス結果を受け取りたいと思います(`・ω・´)シャキーン

その前に、リクエスト先のURL側で実行されるものを用意したいと思います
リクエストのプログラムはPHPで記述します。
今回は文字列を返すだけなので2行だけで楽チンワーイヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノワーイ
<?php
header("Content-Type: text/plain; charset=utf-8");
echo "hogehoge";
?>
次は、AndroidManifest.xmlの編集になります。 今回はインターネットへのアクセスが含まれるので許可してあげる必要があります。 この許可がされていない場合だと、次のようなエラーが発生してしまいます。
onErrorResponsejava.net.UnknownHostException: ホスト名
AndroidManifest.xmlのソース
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.volleyexample"
    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.volleyexample.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>
次は、実際のAndroid側のMainActivityのコードになります。
package com.example.volleyexample;

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

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
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();
 //リクエスト先
 private static final String REQUEST_URL_RESEPONSE_STRING = "リクエスト先の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();
  //HTTPリクエストを行う
  requestString();
 }
 
 /*
  * アプリが見えなくなったときに呼び出される。
  * (他のアプリを立ち上げたりした時など)
  */
 @Override
    public void onStop(){
        super.onStop();
        mRequestQueue.cancelAll(TAG_REQUEST_QUEUE);
    }
 /*
  * 
  */
 private void requestString(){
  
  //リクエスト&レスポンス情報の設定
  //StringRequestの場合
  StringRequest request = new StringRequest(
   //送信方法 GET/POST
   Request.Method.GET, 
   //送信先
   REQUEST_URL_RESEPONSE_STRING,
   //レスポンス成功時のリスナー
   new Response.Listener<String>() {
    @Override 
    public void onResponse(String response) {
     
     //レスポンス受け取り時の処理
     if (response == null){
      //空の場合
      return;
     }
     //
     Toast.makeText(getApplicationContext(), response, 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();  
 }
 
 @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;
 }

}

次の画像のように、「hogehoge」が表示された成功です( ´∀`)bグッ!

次は、POST送信を行いたいと思います
今回はPOSTされてきた値を元に表示を変えるプログラムに変更しました(ΦωΦ)フフフ…
<?php

$nMode = isset( $_POST[ "mode" ] ) ? (int)$_POST[ "mode" ] : 0;
header("Content-Type: text/plain; charset=utf-8");
echo "{$nMode} ほげほげ";

exit(0);

?>
次は、実際のAndroid側のMainActivityのコードになります。
requestStringPostメソッドが追加されています( ̄ー ̄)ニヤリ
送信するパラメーターは次の箇所の中に書く必要があります。
protected Map<String, String> getParams() throws AuthFailureError {
//POSTするデータ
}
ソースコードは次のようになりました。
package com.example.volleyexample;

import java.util.HashMap;
import java.util.Map;

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

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
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();
 //リクエスト先
 private static final String REQUEST_URL_RESEPONSE_STRING = "リクエスト先の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();
  //HTTPリクエストを行う
  //requestString();
  //
  requestStringPost(99);
 }
 
 /*
  * アプリが見えなくなったときに呼び出される。
  * (他のアプリを立ち上げたりした時など)
  */
 @Override
    public void onStop(){
        super.onStop();
        mRequestQueue.cancelAll(TAG_REQUEST_QUEUE);
    }
 /*
  * 
  */
 private void requestString(){
  
  //リクエスト&レスポンス情報の設定
  //StringRequestの場合
  StringRequest request = new StringRequest(
   //送信方法 GET/POST
   Request.Method.GET, 
   //送信先
   REQUEST_URL_RESEPONSE_STRING,
   //レスポンス成功時のリスナー
   new Response.Listener<String>() {
    @Override 
    public void onResponse(String response) {
     
     //レスポンス受け取り時の処理
     if (response == null){
      //空の場合
      return;
     }
     //
     Toast.makeText(getApplicationContext(), response, 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();  
 }
 /*
  * POST送信用
  */
 private void requestStringPost(final Integer mode){
  
  //リクエスト&レスポンス情報の設定
  //StringRequestの場合
  StringRequest request = new StringRequest(
   //送信方法 GET/POST
   Request.Method.POST, 
   //送信先
   REQUEST_URL_RESEPONSE_STRING,
   //レスポンス成功時のリスナー
   new Response.Listener<String>() {
    @Override 
    public void onResponse(String response) {
     
     //レスポンス受け取り時の処理
     if (response == null){
      //空の場合
      return;
     }
     //
     Toast.makeText(getApplicationContext(), response, Toast.LENGTH_LONG).show();
    }
   },
   //レスポンス失敗時のリスナー
   new Response.ErrorListener() {
    @Override 
    public void onErrorResponse(VolleyError error) {
     
     //エラー時の処理
     Toast.makeText(getApplicationContext(), "onErrorResponse", Toast.LENGTH_LONG).show();

    }
   }
  ){
   protected Map<String, String> getParams() throws AuthFailureError {
    //POSTで送信したい値を設定する
    Map<String, String> obj = new HashMap<String, String>();
    obj.put("mode", mode.toString());
    return obj;
   }
  };

  //タグを設定する
  request.setTag(TAG_REQUEST_QUEUE);
  
  //リクエスト&レスポンス情報の設定を追加
  mRequestQueue.add(request);

  //リクエスト開始
  mRequestQueue.start();  
 }
 
 @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;
 }

}


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

参考URL

0 件のコメント:

コメントを投稿