[Android] Handling API using Retrofit2 & RxJava2

NH. Thanh
5 min readJan 9, 2020

--

Khi lập trình ứng dụng, thì việc giao tiếp với server là điều tất yếu, hầu như các ứng dụng hiện nay đều sẽ giao tiếp với server thông qua REST Api với các phương thức phổ biến nhất là POST, GET, PUT, DELETE (ứng với CRUD) để lấy hay cập nhật dữ liệu thông qua Api.

Và trong Android, có những thư viện support việc này cực kỳ tốt là Okhttp3, Retrofit2. Trong phạm vi bài viết này, mình sẽ tạo 1 project nhỏ để ứng dụng 2 thư viện này và giới thiệu thêm về thư viện support trong quá trình xử lý dữ liệu response là RxJava2. Nội dung bài viết này sẽ gồm các phần sau.

I. Giới thiệu qua về Okhttp3, Retrofit2, RxJava2

II. Xây dựng ứng dụng call data thông qua api sử dụng các thư viện hỗ trợ trên.

Ứng dụng demo sau khi build hoàn tất

Bắt đầu thôi…

I. Giới thiệu qua về Okhttp3, Retrofit2, RxJava2

Trong bài viết này mục tiêu nhắm đến là ứng dụng các thư viện trên, nên sau đây chỉ là phần giới thiệu sơ qua về khái niệm và mục đích của các thư viện.

Photo by Andrew Neel on Unsplash
  1. Okhttp3

Okhttp là thư viện sẽ giúp chúng ta kiểm soát được kết nối mạng, nó cung cấp các hàm để hỗ trợ việc kết nối . vd: timeout, certificate, custom Interceptor,… nó có khá nhiều hàm để quản lý việc kết nối, và tất nhiên mình cũng chưa sử dụng hết nên có thể tham khảo thêm tại ĐÂY.

2. Retrofit2

Retrofit cũng là một cái tên có số má trong giới hỗ trợ networking bên cạnh AsyncTask và Volley, nó hỗ trợ rất mạnh và có callback nên chỉ việc cung cấp url, params,… là đủ. Retrofit có đi kèm thêm lớp Gson, Gson hỗ trợ việc phân tích Json rất tiện, và một điểm mạnh của Retrofit nữa là nó hỗ trợ upload Multipart rất tốt.

Một chút ví dụ về Retrofit:

public interface LoginService {
@GET("v2/5e15a0d03400006500406661")
Observable<ResponseModel<ProfileModel>> requetLogin();
}

Tham khảo thêm Retrofit ở ĐÂY.

3. Rxjava2

Retrofit2 còn hỗ trợ thêm bộ RxJava2CallAdapterFactory để làm việc cùng với Rxjava2. RxJava2 là thư viện hỗ trợ việc bất đồng bộ không chỉ vậy nó còn cung cấp 1 bộ rất nhiều operator hỗ trợ. Ví dụ với đầu ra là một kiểu String, muốn chuyển sang kiểu Int có thể sử dụng map operator, hay để loại bỏ một vài thành phần có thể sử dụng filter operator. Dạng chung của nó như thế này.

source
.operator1()
.operator2()
.operator3()
.subscribe(consumer)

Giới thiệu sơ qua thôi, có thể xem thêm RxJava ở ĐÂY nhé.

II. Xây dựng ứng dụng call data thông qua api sử dụng các thư viện hỗ trợ trên.

Ứng dụng này mình sẽ xây dựng tiếp dựa trên bài viết MVP.

API được tạo tạm thời tại ĐÂY

http://www.mocky.io/v2/5e1597353400005200406612
http://www.mocky.io/v2/5e15a0d03400006500406661

  1. Xây dựng kết nối bằng Okhttp + Retrofit
File RestClient sử dụng để cầu hình Okhttp và Retrofit

Cấu hình Retrofit như sau

private static Retrofit.Builder builder =
new Retrofit.Builder()
.baseUrl(BASE_URL)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create()).client(getHttpClient().build());

Để ý ở RxJava2CallAdapterFactory.create()- để làm việc cùng với RxJava2 ta phải thêm Factory này vào hén.

GsonConverterFactory.create() — Retrofit hỗ trợ việc phân tích json trả về từ server , thông qua Gson sẽ parse thành Model tương ứng, có thể xem model ở project nhé.

Để tạo một model Java từ json có sẵn thì có thể sử dụng trang web NÀY để tạo, rất nhanh và này nọ hehe.

Ok, đến việc cấu hình Okhttp

public static OkHttpClient.Builder getHttpClient() {

HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);

OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addInterceptor(logging);
return httpClient;
}

HttpLoggingInterceptor là lớp được cấu hình thêm từ interface Interceptor để log ra những request/response, rất là cần thiết cho việc debug nhen :D.

Logging request/response

Ở trong project thì mình chỉ cấu hình thêm để debug thôi, còn nếu muốn thêm thì có thể xem vd như sau:

public static OkHttpClient.Builder getHttpClient() {

HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);

OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addInterceptor(logging);
httpClient.connectTimeout(5, TimeUnit.SECONDS)
.pingInterval(1,TimeUnit.SECONDS)
.eventListener(new EventListener() {
@Override
public void callStart(Call call) {
super.callStart(call);
Log.e("Start call","Start");
}

@Override
public void callEnd(Call call) {
super.callEnd(call);
Log.e("Stop call","End");
}
});

return httpClient;
}

Ok vậy là giới thiệu với các bạn phần Retrofit vs Okhttp, đến phần tiếp theo nhé.

2. RxJava2

RxJava2 sẽ hỗ trợ việc phân luồng rất nhanh gọn lẹ, RxJava2 có hàm Schedulers.io() được thiết kế chạy theo cơ chế ThreadPool nên việc sẽ giúp việc chạy đa luồng rất tốt,RxAndroid là thư viện kế thừa từ RxJava, nó sẽ cung cấp AndroidSchedulers.mainThread() đưa việc quan sát hiện tại đến MainThread.

service.requetLogin().subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(response->{
view.onLoginSuccess();
view.onStopProcessBar();
},throwable -> {
throwable.printStackTrace();
view.onLoginFail();
});

subscribeOn() sẽ chỉ định luồng thực hiện tác vụ và observeOn() sẽ chỉ định luồng nhận kết quả trả về, vì vậy nên thực hiện đặt các operator của RxJava ngay sau subcribeOn(Schedulers.io()), và observeOn(AdroidSchedulers.mainThread()) khi đã hoàn tất các operator.

3. Ví dụ về luồng call api đơn giản

Tạo một api tại ĐÂY, json mình tạo sẽ có dạng như sau

{"exitcode":1,"data":[{"url":"https://vcdn-vnexpress.vnecdn.net/2020/01/06/meo-tu-can-con-2478-1578323981.jpg","name":"Con mèo"},{"url":"https://vcdn-vnexpress.vnecdn.net/2020/01/06/meo-tu-can-con-2478-1578323981.jpg","name":"Lại là con mèo"}]}

tạo 1 Model Response dùng chung

ResponseModel

và Model data parse từ json trên, thông qua jsonschema2pojo

PhotoModel

Các thư viện đã import sẵn trong project, có thể tải ở ĐÂY

Tạo 1 file cấu hình retrofit vs okhttp đã đưa ở trên, xem tại ĐÂY

Tạo 1 interface cung cấp Api

Ok chỉ vậy là xong phần chuẩn bị, tiếp theo sẽ bắt đầu việc gọi data.

Việc thực hiện gọi data được diễn ra khi gọi hàm invokeData(), kết quả trả về sẽ thể hiện lên UI thông qua interface.

invokeData(), mình đã có thêm 1 ví dụ nhỏ về việc xử lý data trả về là thay thế “Con mèo” -> “Thanh” khi sử dụng RxJava2.

ở Activity sẽ nhận dữ liệu thông qua interface như sau

Ok, cài đặt như vậy và kết quả khi build project sẽ được như sau

Tổng kết

Ta da, vậy là đã xong việc sử dụng Retrofit + RxJava để call 1 API, nhìn chung lại Retrofit sẽ hỗ trợ việc request/response thông qua các phương thức @POST, @GET, @PUT, @DELETE,… (ở bài này vd về @GET ). Okhttp giúp cấu hình việc kết nối như timeout, certificate(đối với các cổng https), pingInterval,…RxJava2 sẽ hỗ trợ việc bất đồng bộ và thêm một vài operator để xử lý dữ liệu trả về.

Bài viết dựa trên việc tìm hiểu và kiến thức cá nhân, nếu có sai sót mong nhận được đóng góp để bài viết được phát triển và hoàn thiện hơn ❤.

Photo by Alesia Kazantceva on Unsplash

Link tải project: tải tại ĐÂY

Tham khảo:

https://github.com/ReactiveX/RxJava

--

--