SSブログ

Android・・・Volley [Android]

あるアプリ作成での通信処理部分を今回はVolleyを使用して作成した。

理由としてはJSONデータを送受信するのみの通信処理だった為。

そして、備忘録として処理を残す。
※今回はJSONデータを送受信するのみだったので最低限の処理のみだが今後画像なども扱う場合は処理内容を追加していく。


■Volleyの公式リポジトリ
https://android.googlesource.com/platform/frameworks/volley/

■Volleyのドキュメント
http://developer.android.com/intl/ja/training/volley/index.html


Volleyは以下の通信処理を効率的に支援してくれている。
・データ取得処理(JSON、XMLなど)
・データパース処理
・表示情報取得処理(画像、テキストなど)
・画面への設定処理(ImageView)


---------------------------------------------------------------
■開発環境
---------------------------------------------------------------
・Windows 7
・Android Studio 1.5


---------------------------------------------------------------
■Volleyの導入
---------------------------------------------------------------
Volleyをプロジェクトに導入するには以下の2つ方法がある。

①gitでVolleyプロジェクトを追加する
Volleyの公式リポジトリよりVolleyを取り組み、開発プロジェクトに追加する。
そして、build.gradle(Module:app)に以下を追加する。

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':volley')
}

・メリットについて
プロジェクトごと取り込むので、Volleyの内容についてのカスタマイズ等が可能である。

・デメリットについて
ビルド時に依存関係の解決がされないので場合によって競合が起きる。


②外部リポジトリから取り込む
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.mcxiaoke.volley:library:1.0.+'
}

・メリットについて
バージョン指定が出来、ビルド時の依存関係も意識する必要がない。

・デメリットについて
公開停止になれば使えなくなるのと、Volleyの内容についてのカスタマイズ等が不可能である。


---------------------------------------------------------------
■Volleyの実装サンプル
---------------------------------------------------------------
①Volleyインスタンス作成・停止クラス
※Volleyはシングルインスタンスで扱うようにすること。

public class VolleyHelper {
    private static final Object sLock = new Object();
    private static RequestQueue sQueue;


    public static void resetVolley() {
        if (sQueue != null) {
            sQueue.stop();
        }
        sQueue = null;
    }

    public static void addRequest(final Context conetxt, JsonObjectRequest request) {
        if (sQueue == null) {
            sQueue = Volley.newRequestQueue(conetxt);
        }
        sQueue.add(request);
    }

    /**
    * Volleyインスタンス作成処理
    *
    * @param conetxt コンテキスト
    * @return Volleyインスタンス
    */
    public static RequestQueue getRequestQueue(final Context conetxt) {
        synchronized (sLock) {
            if (sQueue == null) {
                sQueue = Volley.newRequestQueue(conetxt);
            }
            return sQueue;
        }
    }

    public static void startQueue(final Context conetxt) {
        if (sQueue == null) {
            sQueue = Volley.newRequestQueue(conetxt);
        }
        sQueue.start();
    }

    public static void cancelQueue() {
        if (sQueue != null) {
            sQueue.cancelAll(new RequestFilter() {;
                @Override
                public boolean apply(Request request) {
                    return true;
                }
            });
        }
    }

    public static void stopQueue() {
        if (sQueue != null) {
            sQueue.stop();
            sQueue = null;
        }
    }
}




②Volley通信処理のタイムアウト及びリトライ回数設定クラス

public class VolleyRetryPolicy extends DefaultRetryPolicy {
    /** タイムアウト値 */
    private static final int CONNECTION_TIMEOUT = 10000;
    /** リトライ回数(初回リクエスト失敗後の回数) */
    private static final int CONNECTION_RETRY_NUM = 5;
    /** インターバル値 */
    private final long INTERVAL_TIME = 3000;
    private Request mRequest;

    public VolleyRetryPolicy(Request request) {
        super(CONNECTION_TIMEOUT, CONNECTION_RETRY_NUM, 1f);
        mRequest = request;
    }

    @Override
    public void retry(VolleyError error) throws VolleyError {
        NetworkResponse response = error.networkResponse;
        if (response != null && response.statusCode >= 500 && response.statusCode < 600) {
            throw error;
        }

        if (mRequest != null && mRequest.isCanceled()) {
            throw error;
        }

        if (INTERVAL_TIME > 0 ) {
            try {
                Thread.sleep(INTERVAL_TIME);
            }
            catch (InterruptedException e) {
            }
        }
        super.retry(error);
    }
}




③Activityクラス
今回はサンプルなのでActivity内でVolleyをコールして通信する。

public class MainActivity extends AppCompatActivity {
    /** 通信リクエスト */
    protected JsonObjectRequest mRequest;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        VolleyHelper.getRequestQueue(getApplicationContext());
        startQueue();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        VolleyHelper.cancelQueue();
        VolleyHelper.stopQueue();
    }

    private void startQueue() {
        final String url = "http://xxxxx/xxxxx(通信先URL)";

        mRequest = new JsonObjectRequest(
            Request.Method.GET,
            url,
            null,
            // 通信成功時の処理
            new Response.Listener() {
                public void onResponse(JSONObject jsonRoot) {
                    //JSON解析処理記述
                    ・・・
                }
            }
        },
        // 通信失敗時の処理
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                // ダイアログ等             }
        });
        // リクエストのリトライ及びタイムアウト設定
        mRequest.setRetryPolicy(new VolleyRetryPolicy(mRequest));
        VolleyHelper.addRequest(getApplicationContext(), mRequest);
    }
}




nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。