Android

Thao tác với network trong Android sử dụng thư viện Volley

Giới thiệu

Volley được Google giới thiệu vào khoảng tháng 6/2013. Volley là một thư viện dùng để send và recieve response từ Server sử dụng giao thức HTTP.

Volley có các điểm nổi bật dưới đây:

  • Tự động lập lịch (scheduling) cho các request.
  • Caching Response.
  • Hỗ trợ set độ ưu tiên cho các request (priority).
  • Hỗ trợ nhiều kết quả trả về (String, JSONObject, JSONArray, Bitmap…)
  • Có thể huỷ Request.

Các class sử dụng trong Volley:

RequestQueue: Là hằng đợi giữ các Request.

Request: là lớp cơ sở của các Request trong Volley, chứa thông tin về request HTTP.

StringRequest: Kết thừa từ Request, là class đại diện cho request trả về String.

JSONObjectRequest: Là HTTP request có response trả về là JSONObject.

JSONArrayRequest: Là HTTP request có response trả về là JSONArray.

ImageRequest: Là HTTP request có response trả về là Bitmap.

Ngoài ra chúng ta có thể tạo custom request. Nhưng trong phạm vi bài viết tôi không giới thiệu.

Các bạn cói thể xem video giới thiệu Volley tại Goolge IO/2013.

Dươi đây là mô hình làm việc của Volley:

volley-request-0

Sử dụng thư viện Volley

Trước tiên chúng ta phải import thư viện này vào Android Studio. Copy và paste dòng dưới đây và dependencies trong file build.gradle của module app:

Nhấn Async Now để Android Studio download và nạp thư viện vào project.

Để sử dụng Volley chúng ta phải cấp quyền Internet trong AndroidManifest.xml như sau:

RequestQueue

Việc sử dụng Volley rất đơn giản, các bạn chỉ cần tạo một RequestQueue bằng lệnh

Phương thức này về một RequestQueue. Khi đã có RequestQueue chúng ta chỉ cần các loại Request và add các request đó vào RequestQueue.

Chúng ta thấy rằng nếu tôi gọi Volley.newRequestQueue(context); n lần thì có n RequestQueue được tạo ra. Ứng dụng của tôi chỉ cần duy nhất một RequestQueue dử dụng cho toàn app (Activity, Fragment, Service…) Vì vậy, tôi sử dụng Singleton để thiết kết lớp VolleySingleton có nhiệm vụ quản lý RequestQueue như sau:

StringRequest

GET:

POST:

Với POST các bạn phải Override lại phương thức getParam() và put các key, value như dưới đây:

Độ ưu tiên của Request:

Trong Volley, Request có thể mang các giá trị Priority như dưới đây:

Với các mức độ ưu tiên tăng dần. Và mặc định Request trong Volley có gía trị là NORMAL.

Để set giá trị ưu tiên cho Request các bạn phải Override lại phương thức getPriority.

Cách tạo request đối với JSONObjectRequest, JSONArrayObject, ImageRequest đều tương tự như với StringRequest. Contructor sẽ có những thành phần dưới đây:

+ Method POST, GET.

+ Contructor truyền vào url của request

+ Hai Listener là Response.Listener và Response.ErrorListener

JSONObjectRequest

Request có response trả về là JSONObject.

Nếu Request thành công chúng ta có thể lấy ra đối tượng JSONObject trong phương thức onResponse. Ngược lại chúng ta sẽ có thông tin lỗi trong phương thức onErrorResponse.

JSONArrayRequest

Tương tự như JSONObjectRequest nhưng JSONArrayRequest trả về một JSONArray nếu thành công trong phương thức onResponse.

ImageRequest

ImageRequest trả về response là một bitmap nếu thành công. Ngược lại trả về lỗi trong phương thức onErrorResponse.

Add Request to RequestQueue

Để tiến hành send request đến server chúng ta cần phải add những request vừa tạo ở trên vào RequestQueue.

Source MainActivity.java

Kết quả sau khi run project

Source code trong bài viết các bạn có thể download ở đây: VolleyDemo

Kết luận

Trên đây tôi đã hướng dẫn các bạn cách sử dụng thư viện Volley để send và nhận response từ Server thông sử dụng giao thức HTTP. Hy vọng bài viết giúp ích cho tất cả các bạn trong học tập cũng như công việc. Nếu có bất cứ khó khăn, thắc mắc nào hãy để lại bình luận dưới bài viết hoặc liên hệ với fanpage Eitguide Android để được giải đáp.

9 thoughts on “Thao tác với network trong Android sử dụng thư viện Volley”

  1. Cho em hỏi làm sao để lấy được respon trả về trong hàm onRespon lưu ra 1 biến ngoài ạ.

      1. Mình làm như bạn nói nhưng ko lấy được
        Log ở trong hàm onResponse thì lấy được, nhưng gán n ra ngoài log ra ko được chuỗi null
        🙁

    1. Mình cũng đang bị gặp vấn đề này không biết bạn đã giải quyết được chưa? Nếu được bạn hướng dẫn giúp mình nhé

  2. Nhìn cái mô hình làm việc của nó mình không hiểu lắm. Theo như mình hiểu thì khi cache miss request sẽ được NetworDIspatcher dequeue, nhưng chẳng phải trước đó request đã được dequeue bởi CacheDispatcher rồi sao?

    1. Một request sẽ đươc kiểm tra xem thử response của nó đã được cache hay chưa. Nếu cache rồi sẽ trả về kết quả mà không cần gửi request lên Server. Ngược lại response chưa cache thì request đó được gửi lên server và chờ kết quả trả về bạn ạ.
      Bạn có thể lấy cache bằng cách VolleySingleton.getInstance(this).getRequestQueue().getCache().

  3. Bạn Nghĩa ơi, bạn có thẻ làm 1 bài viết về Retrofit được không? Mình đọc nhiều bài về nó nhưng chưa hiểu, thấy nó khó dùng va phức tạp hơn Volley nhiều, nhưng tốc độ nhanh hơn.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.