Android

Gửi HttpRequest và nhận HttpResponse trên Android với Volley

Khi viết ứng dụng Android có thực hiện giao tiếp với Internet server, tức gửi HttpRequest và nhận HttpResponse về, thì vấn đề tối ưu hóa việc gửi nhận gây tốn không ít Paracetamol cho các lập trình viên vì phải tìm các giảm thiểu thời gian thực hiện, từ lúc gửi Request đi cho tới khi quá trình parse Response hoàn tất. Vì vậy, thư viện Android Volley ra đời nhằm giảm thiểu sự căng thẳng đó. Và hôm nay, tôi sẽ giới thiệu với các bạn cách sử dụng thư viện đơn giản nhưng mang lại hiệu quả cao này.

Android_Volley

1. Sơ lược về Volley:

Volley is an HTTP library that makes networking for Android apps easier and most importantly, faster. Volley is available on GitHub. It offers the following benefits:

  • Automatic scheduling of network requests.
  • Multiple concurrent network connections.
  • Transparent disk and memory response caching with standard HTTP cache coherence.
  • Support for request prioritization.
  • Cancellation request API. You can cancel a single request, or you can set blocks or scopes of requests to cancel.
  • Ease of customization, for example, for retry and backoff.
  • Strong ordering that makes it easy to correctly populate your UI with data fetched asynchronously from the network.
  • Debugging and tracing tools.

Nói chung, Volley là một thư viện khá linh hoạt, tự động sắp xếp và triển khai gửi Requests theo tuần tự và mức độ ưu tiên, với khả năng gửi đồng thời đa luồng Requests, cũng như tiến hành gửi lại hoặc hủy bỏ (các) lượt gửi Requests và quan trọng nhất là cache lại dữ liệu, để tránh phải gửi đi và nhận lại những dữ liệu có kết quả giống nhau. Volley được viết bởi chính Google.

2. Thêm thư viện vào project:

Tôi cho rằng bạn đã quá quen thuộc với thao tác thêm thư viện nên chỉ để lại vài dòng bên dưới mà không nói gì thêm:

Ngoài ra, bạn cũng cần thêm INTERNET permission vào AndroidManifest nếu chưa có, và đối với Android 8.0 API26 về sau, bạn cần thêm dòng android:usesCleartextTraffic=”true” vào <application> cũng trong AndroidManifest:

3. Tạo RequestQueue:

Mọi Request chỉ sẽ được gửi đi khi và chỉ khi chúng nằm trong RequestQueue. Do vậy, RequestQueue là điều kiện cần trước khi bạn thực hiện bất kì Request nào. Thông thường, bạn sẽ sử dụng một static method rất đơn gỉản mà Volley cung cấp cho bạn:

Mặc dù tham số trong newRequestQueue là một Context, tức bạn có thể truyền vào đó một (AppCompat)Activity hay Service, tuy nhiên điều đó không nên, vì Activity hay Service đều có thể bị dừng đột ngột trong quá trình thực hiện gửi Request và đang chờ Response, chẳng hạn như khi bạn xoay màn hình thì Activity sẽ được khởi tạo lại. Do đó, bạn nên dùng Context#getApplicationContext.

Đó là method được cung cấp sẵn để bạn có thể dùng ngay và luôn cho nóng mà không cần phải tự cấu hình một RequestQueue bằng tay. Tuy nhiên vẫn có lúc bạn phải làm điều đó, chẳng hạn như bạn muốn Volley lưu cache vào thư mục bạn chỉ định, hay phải điều chỉnh THRESHOLD, thì bạn cần tự định nghĩa một RequestQueue.

Public constructor RequestQueue yêu cầu hai tham số: Cache là nơi bạn lưu cache và kích thước cap, và Network định nghĩa HttpStack. Dưới đây là các tham số mặc định mà Volley.newRequestQueue(Context) sẽ khởi tạo:

Để tham khảo về các class trên, mời bạn “bay” tới phần src của Volley trên GitHub tại địa chỉ https://github.com/google/volley/tree/master/src/main/java/com/android/volley.

Và sau khi bạn tạo một RequestQueue, để nó có thể sử dụng được, tức yêu cầu nó gửi request, thì bạn phải gọi RequestQueue#start, bằng không thì dù bạn có add 1000 Requests vào thì nó cũng không gửi cho bạn. Một điểm hay là bạn chỉ cần gọi start() một lần cho mỗi RequestQueue trước hoặc sau khi add các Request, và sau khi start() được gọi, một Request sẽ được gửi ngay sau khi bạn add vào chính RequestQueue đó. Dưới đây là code minh họa cách tạo instance RequestQueue của Volley.newRequestQueue(Context):

4. Gửi StringRequest:

StringRequest sẽ trả về một String trong Response. Về chi tiết về class này, mời bạn tham khảo vào class StringRequest trong package toolbox của Volley trong địa chỉ GitHub bên trên. Ở đây, tôi sẽ sử dụng constructor StringRequest(int method, String url, Listener<String> listener, @Nullable ErrorListener errorListener), với method là GET, và url là “http://www.google.com”, và Request được thực hiện trong một class extends Context:

5. Gửi JsonRequest:

Có hai loại JsonRequest tùy vào bản chất của Json, là JsonArrayRequest và JsonObjectRequest và chúng trả về kết quả tương ứng là JSONArray và JSONObject. Để bạn dễ phân biệt, tôi đưa ra hai ví dụ minh họa như sau:

Cách tạo JsonRequest cũng hoàn toàn tương tự như StringRequest, chỉ khác class của response trả về. Lưu ý tham số null trong constructor là phần Body của Request. Vì method tôi đang dùng là GET nên đương nhiên, Request này không có Body và cũng được thực hiện trong một class extends Context:

6. CustomRequest

Thông thường, các StringRequest, JsonRequest hay ImageRequest mà Volley cung cấp cho bạn đã đủ dùng. Tuy nhiên, trong các trường hợp bạn muốn trực tiếp cast đối tượng Response thành các instance của các class bạn đã định, tức data model, thì bạn có thể trực tiếp tạo một class Request theo ý bạn.

Trước hết, class gốc Request nhận một type object <T> là class mà bạn muốn Response trả về. Chẳng hạn, tôi muốn Response trả về class Student thì tôi sẽ đặt Request<Student>. Do đó, việc đầu tiên bạn cần làm là extends Request<T>. Chẳng hạn:

Và công việc của bạn là tiến hành sửa body của hai methods trên theo ý của bạn. Trong đó,  parseNetworkResponse – cái tên nói lên tất cả – là các hành động xử lí Response của bạn, với Response được trả về là NetworkResponse response. Và method thứ hai, deliverResponse bao gồm hướng xử lí của bạn với Response đã được parsed xong. Tham số duy nhất của deliverResponse(T response) chính là giá trị mà parseNetworkResponse(NetworkReponse) return.

Tuy nhiên, tôi khuyên các bạn không nên tự tạo một custom request nếu Request/Response của bạn rơi vào các trường hợp String, Image hay Json. Trong trường hợp như vậy, bạn nên dùng các class có sẵn, vừa ổn định hơn, vừa đỡ tốn thời gian suy nghĩ. Với Json, bạn nên chịu khó ngồi dùng các method getJSONObject, getJSONArray, getString, getInt, v.v… để lấy các thuộc tính của đối tượng, sẽ dễ dàng hơn.

Và hi vọng với những kiến thức này, bạn đã có thể thoải mái gửi HttpRequest và nhận HttpReponse trên Android mà không phải code tay từng dòng mà hiệu năng không cao. Ngoài Volley ra, chúng ta còn bộ thư viện Retrofit nữa giúp gửi nhận ReqRes với tốc độ cao. Tuy nhiên, cá nhân tôi thích dùng Volley hơn vì nó đơn giản trong cách sử dụng với chỉ vài method cần gọi, và hơn nữa là do tôi thích tự xử lí Response hơn, và đặc biệt là ghét dùng annotations vô tội vạ. Tất nhiên, mỗi người mỗi ý, và nếu bạn muốn tìm hiểu về Retrofit, hãy tham khảo loạt bài viết về nó ở đây. Chúc các bạn code vui vẻ và thành công.

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.