6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

androidで、通信ライブラリのvolleyを使うことになったので、個人的メモ

Posted at

Android には、volleyという通信ライブラリがある。
Volley勉強したので、そのメモを書く。

volleyの基本

httpリクエストを送るには、RequestQueueを作り、Requestオブジェクトを渡す。

RequestQueueは、workerスレッドで働く。
レスポンスが帰ってくると、レスポンスをメインスレッドへと渡す。

まず、Volley.newRequestQueueを使い、RequestQueueを作る。

final TextView textView = (TextView) findViewById(R.id.text);
// ...

// Instantiate the RequestQueue.
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://www.google.com";

// Request a string response from the provided URL.
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        // Display the first 500 characters of the response string.
        textView.setText("Response is: "+ response.substring(0,500));
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        textView.setText("That didn't work!");
    }
});

// Add the request to the RequestQueue.
queue.add(stringRequest);

このようにRequestQueueにrequestをaddするのが全ての基本になる。

httpリクエストを送る。

httpリクエストを送るには、シンプルに、RequestQueueに、add()を使い構築する必要がある。
requestQueueにaddすることで自動的にhttpリクエストが投げられ、パースされたレスポンスがメインスレッドに帰ってくる。

public static final String TAG = "MyTag";
StringRequest stringRequest; // Assume this exists.
RequestQueue requestQueue;  // Assume this exists.

// Set the tag on the request.
stringRequest.setTag(TAG);

// Add the request to the RequestQueue.
requestQueue.add(stringRequest);

cacheとnetworkのセットアップ

RequestQueueには、以下の二つが必要だ。
DiskBasedCache: in-memoryのindexを使った1レスポンス=1ファイルのキャッシュ

BasicNetwork: Volleyのデフォルトのネットワーク実行。BasicNetworkは、Httpクライアントで初期化される必要がある。
例えば、HttpURLConnectiontとかで。

以下のコードは、RequestQueueのセットアップの一例だ。

RequestQueue requestQueue;

// Instantiate the cache
Cache cache = new DiskBasedCache(getCacheDir(), 1024 * 1024); // 1MB cap

// Set up the network to use HttpURLConnection as the HTTP client.
Network network = new BasicNetwork(new HurlStack());

// Instantiate the RequestQueue with the cache and network.
requestQueue = new RequestQueue(cache, network);

// Start the queue
requestQueue.start();

String url ="http://www.example.com";

// Formulate the request and handle the response.
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
        new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        // Do something with the response
    }
},
    new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            // Handle error
    }
});

// Add the request to the RequestQueue.
requestQueue.add(stringRequest);

// ...

singletonパターンを使おう

Applicationのサブクラス、Applicationの、onCreate()などを使う方法もあるが、RequestQueueをセットアップするのに一番適した方法は、staticなsingletonクラスを作ることだ。

重要なのはActivityのContextではなく、Applicationのcontextを使うこと。
なぜならApplicationのContextを使うことでアプリが生きている間はRequestQueueの動作が保証されるから。

public class MySingleton {
    private static MySingleton instance;
    private RequestQueue requestQueue;
    private ImageLoader imageLoader;
    private static Context ctx;

    private MySingleton(Context context) {
        ctx = context;
        requestQueue = getRequestQueue();

        imageLoader = new ImageLoader(requestQueue,
                new ImageLoader.ImageCache() {
            private final LruCache<String, Bitmap>
                    cache = new LruCache<String, Bitmap>(20);

            @Override
            public Bitmap getBitmap(String url) {
                return cache.get(url);
            }

            @Override
            public void putBitmap(String url, Bitmap bitmap) {
                cache.put(url, bitmap);
            }
        });
    }

    public static synchronized MySingleton getInstance(Context context) {
        if (instance == null) {
            instance = new MySingleton(context);
        }
        return instance;
    }

    public RequestQueue getRequestQueue() {
        if (requestQueue == null) {
            // getApplicationContext() is key, it keeps you from leaking the
            // Activity or BroadcastReceiver if someone passes one in.
            requestQueue = Volley.newRequestQueue(ctx.getApplicationContext());
        }
        return requestQueue;
    }

    public <T> void addToRequestQueue(Request<T> req) {
        getRequestQueue().add(req);
    }

    public ImageLoader getImageLoader() {
        return imageLoader;
    }
}

以下は、RequestQueueのSingletonでの実行の一例だ。

// Get a RequestQueue
RequestQueue queue = MySingleton.getInstance(this.getApplicationContext()).
    getRequestQueue();

// ...

// Add a request (in this example, called stringRequest) to your RequestQueue.
MySingleton.getInstance(this).addToRequestQueue(stringRequest);

Standard request

StringRequest = raw stringとしてレスポンスを受け取る。
JsonObjectRequest, JsonArrayRequest = Jsonまたは、Arrayとしてレスポンスを受け取る。

一例は以下だ。

String url = "http://my-json-feed";

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
        (Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

    @Override
    public void onResponse(JSONObject response) {
        textView.setText("Response: " + response.toString());
    }
}, new Response.ErrorListener() {

    @Override
    public void onErrorResponse(VolleyError error) {
        // TODO: Handle error

    }
});

// Access the RequestQueue through your singleton class.
MySingleton.getInstance(this).addToRequestQueue(jsonObjectRequest);

volley難しい。もっと素朴なものが欲しいな。

以上個人的メモでした。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?