[Android] 網路框架 Volley

Volley 是 Gogle 在 Google I/O 2013 所發表的網路框架,主要是為了加強 Android 網路應用的效能。推出 Volley 的原因是:
  • 目前廣泛使用的 HttpURLConnection 和 HttpClient 有已知的問題和bug是不易修復的,甚至 HttpClient 已經不再被維護(Android 6 已經正式移除 Apache HTTP Client
  • 目前在 Android 上抓取網路資料的標準作法,是需要透過執行緒,再把結果送回主程序,過程稍嫌複雜
因此,Google 團隊在 2013 年推出了 Volley,Volley 可說是集非同步的網路通訊的優點於一身,它提供了字串、Json格式資料、圖片等三種請求方法,內部把Http請求和執行緒封裝起來,開發者不必再寫冗長的程式來完成一個資料加載的動作。它還提供了Cache,使得性能上獲得大幅度的改善。目前 Google 建議使用 Volley 來存取資料量不大且頻繁的網路通訊,Volley 在大量資料的傳輸上,效能很差。

關於 Volley 的內部架構,可參考An Introduction to Volley一文。
來源:http://code.tutsplus.com/tutorials/an-introduction-to-volley--cms-23800
Maven上目前沒有Google官方提供的Volley封裝檔,建議下載原始碼後,加入Android Studio自行編譯。Volley原始碼在Android Git函式庫中,連結如下:
https://android.googlesource.com/platform/frameworks/volley

更新:Android 已將 Volley 的封裝檔放到 JCenter 上,因此現在可以使用 Gradle 安裝 Volley 了
compile 'com.android.volley:volley:1.0.0'

範例

String、Json、Image三個的寫法差不多,都是先從URL連結啟動請求之後,將請求加到Queue去處理(請注意,這是非同步的),若成功則在onResponse事件中取得回傳值,若失敗則會在onErrorResponse得到錯誤訊息。

String Request

final TextView mTextView = (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() {
    @Override
    public void onResponse(String response) {
        // Display the first 500 characters of the response string.
        mTextView.setText("Response is: "+ response.substring(0,500));
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        mTextView.setText("That didn't work!");
    }
});
// Add the request to the RequestQueue.
queue.add(stringRequest);

Json Request

TextView mTxtDisplay;
ImageView mImageView;
mTxtDisplay = (TextView) findViewById(R.id.txtDisplay);
String url = "http://my-json-feed";

JsonObjectRequest jsObjRequest = new JsonObjectRequest
        (Request.Method.GET, url, null, new Response.Listener() {

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

    @Override
    public void onErrorResponse(VolleyError error) {
        // TODO Auto-generated method stub

    }
});

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

Image Request

ImageView mImageView;
String url = "http://i.imgur.com/7spzG.png";
mImageView = (ImageView) findViewById(R.id.myImage);
...

// Retrieves an image specified by the URL, displays it in the UI.
ImageRequest request = new ImageRequest(url,
    new Response.Listener() {
        @Override
        public void onResponse(Bitmap bitmap) {
            mImageView.setImageBitmap(bitmap);
        }
    }, 0, 0, null,
    new Response.ErrorListener() {
        public void onErrorResponse(VolleyError error) {
            mImageView.setImageResource(R.drawable.image_load_error);
        }
    });
// Access the RequestQueue through your singleton class.
MySingleton.getInstance(this).addToRequestQueue(request);

相關文章

如何將電腦畫面經由 Chromecast 投放到電視螢幕上

Mac與Android裝置傳輸檔案的方法

Chrome 的檔案續傳功能

使用 Line Bot API 製作聊天機器人