Trang bị thêm hủy nhiều cuộc gọi API

Tram Ho

Hôm nay chúng ta sẽ xem cách sử dụng Retrofit để gọi một API nhiều lần và cancel tất cả các lời gọi trước đó khi thực hiện một cuộc gọi mới. Ngoài ra, chúng ta sẽ thấy cách sử dụng coroutines với Retrofit.

Use-Case: Khi implement chức năng tìm kiếm trong App – chúng ta request API mỗi khi user nhập nội dung nào đó trong EditText (Cố gắng để việc tìm kiếm được thực hiện trong thời gian thực) và hủy tất cả các lệnh gọi API trước đó.

Đầu tiên, chúng ta cần thêm phụ thuộc RetrofitCoroutines vào tệp Gradle. Thêm các dòng này vào build.gradle ở App-level:

Bây giờ tạo một interface cho retrofit có tên là ApiService.

Chúng ta sử dụng API demo từ https://demo.dataverse.org, đây là dịch vụ API demo miễn phí chúng ta sử dụng để thử nghiệm. Nó sẽ cung cấp kết quả tìm kiếm theo truy vấn của người dùng.

Chúng ta sử dụng suspend function của Kotlin thay vì function thông thường vì chúng ta sẽ sử dụng coroutines để quản lý API.

Bây giờ tạo một data class cho API này có tên SearchResultModel.

Bây giờ, tạo ra một file object nhà cung cấp API có tên ApiProvider, đối tượng này sẽ được sử dụng để tạo một retrofit instance:

Ở đây chúng ta đang tạo OkHttp client để log request và response API và thiết lập Retrofit. Biến retrofit, được sử dụng để get một instance của Retrofit client.

Chúng ta sẽ sử dụng các repository classes/object để xử lý dữ liệu.

Vì vậy, chúng ta tạo một object là DataRepository:

Ở đây, trước tiên chúng ta đã tạo một instance của APIService trong khối init, để khởi tạo retrofit bất cứ khi nào DataRepository được khởi tạo.

Lưu ý: Vì chúng ta đang sử dụng một object thay vì class nên chỉ một instance duy nhất sẽ được tạo và chia sẻ trên ứng dụng.

Bây giờ chúng ta sẽ tạo một generic data class, đây sẽ là wrapper class để nhận tất cả các responses từ các lệnh gọi API. Chúng ta sử dụng wrapper class với LiveData để có thể notify cho các views bất cứ khi nào có dữ liệu từ API.

Tạo một data class có tên GenericDataModel.

Ngoài ra, lưu ý rằng chúng ta đang khai báo kiểu dữ liệu genetic T để có thể tái sử dụng class này cho tất cả các kiểu Responses.

Bây giờ đây là phần cuối cùng gọi API trong thực tế. Trong Activity, tạo một function có tên startSearching truyền vào parameter kiểu String. Phương thức này sẽ được gọi mỗi lần khi người dùng gõ bất cứ thứ gì để tìm kiếm:

Bây giờ chúng ta sẽ tạo một Coroutine trong function startSearching, nó sẽ gọi API và thực hiện phần còn lại của quá trình xử lý trong một background thread, cuối cùng nó sẽ gửi kết quả trở lại trong Main thread.

Trong phương thức trên, có thể thấy rằng chúng ta đã cung cấp Dispatchers.IO cho coroutine scope, có nghĩa là mọi thứ bên trong sẽ được gọi trong background thread. Ngoài ra, hàm withContext(Dispatchers.Main) này bên trong Coroutine sẽ chạy bất cứ thứ gì bên trong nó trở lại main thread.

Bây giờ, hãy lấy một instance của coroutine và tạo một biến global để lưu trữ instance đó. Điều này được thực hiện để tránh tạo ra nhiều coroutines cho mỗi lời gọi và hủy yêu cầu trước đó trước khi thực hiện tìm kiếm mới. Tạo một biến global kiểu Job và trả về một instance của coroutine cho biến này trong phương thức startSearching.

Bây giờ ở đây tất cả điều quan trọng xảy ra, chúng ta không cần quản lý bất cứ điều gì ở đây. Chúng ta không phải chờ đợi response từ API, không cần phải sử dụng bất kỳ callbacks nào. Tất cả điều này được quản lý bởi chính retrofit vì chúng hỗ trợ các coroutines với các suspend functions.

Bây giờ, hãy thêm TextWatcher vào EditText để lắng nghe tất cả các sự kiện bất cứ khi nào người dùng bắt đầu nhập để có thể bắt đầu các lệnh gọi API cho Search Query. Ngoài ra, chúng ta có thể tạo một extension function cho việc này.

Lưu ý rằng bên trong afterTextChanged, chúng ta đã hủy CoroutineJob trước đó để nó tự động hủy các lệnh gọi API trước đó. Sau đó gọi phương thức startSearching để lời gọi API mới sẽ được thực hiện.

Đây là cách chúng ta có thể quản lý hủy các cuộc gọi API trước đó khi thực hiện cuộc gọi mới để chỉ nhận được kết quả cho chính cuộc gọi API mới nhất và sau cùng.

Ref: https://proandroiddev.com/retrofit-cancelling-multiple-api-calls-4dc6b7dc0bbd

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo