+3

Retrofit and Rxandroid

I. Giới thiệu về Retrofit và Rxandroid

  1. Retrofit.

Retrofit là một thư viện hỗ trợ việc kết nối và lấy dữ liệu từ một WebService cho Android và Java, được tạo ra bởi Square. Với retrofit bạn có thể dễ dàng lấy dữ liệu từ webservice, convert dữ liệu trả về dạng json thành các object. 2. RXjava và Rxandroid.

Rxjava và Rxandroid Là thư viện mã nguồn mở implement ReactiveX trên Java, ReactiveX hỗ trợ lập trình dữ liệu bất đồng bộ, được thiết kế dự trên Observer pattern, nó giúp cho việc sử lý dữ liệu bất đồng bộ một cách hiệu quả , Rxjava cung cấp rất nhiều các operator hỗ trợ cho việc sử lý dữ liệu nhứ filter, groupBy, ...

II. Ví dụ về sử dụng Retrofit và RxAndroid

Trong ví dụ này chúng ta sẽ thực hiện lấy về thông tin thời tiết của một thành phố dựa vào api của website http://openweathermap.org/. để sử dụng api chúng ta cần đăng kí một tài khoản và lấy api_key.

Để sử dụng Retrofit và RxAndroid chúng ta cần thêm các thư viện vào project.


    //retrofit
    compile 'com.squareup.retrofit2:retrofit:2.1.0'

    //rxjava and rxandroid
    compile 'io.reactivex:rxandroid:1.2.1'
    compile 'io.reactivex:rxjava:1.1.6'
    //rxjava adapter
    compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'

Thêm gói thư viện hỗ trợ convert json sang object

    //convert gson
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'

Sau khi thực hiện request dữ liệu từ api chúng ta sẽ nhận được dữ liệu định dạng json như sau

{
coord: {
lon: 105.85,
lat: 21.03
},
weather: [
{
id: 801,
main: "Clouds",
description: "few clouds",
icon: "02d"
}
],
base: "stations",
main: {
temp: 304.01,
pressure: 1012.14,
humidity: 86,
temp_min: 304.01,
temp_max: 304.01,
sea_level: 1020.34,
grnd_level: 1012.14
},
wind: {
speed: 2.55,
deg: 157.003
},
clouds: {
all: 24
},
dt: 1466568490,
sys: {
message: 0.0111,
country: "VN",
sunrise: 1466547378,
sunset: 1466595662
},
id: 1561096,
name: "Xóm Pho",
cod: 200
}

Từ chuỗi json trên chúng ta tạo các model tuơng ứng, Khi tạo model chúng ta cần lưu ý đến tên và kiểu của các trường dữ liệu phải tuơng ứng trong chuỗi json trả về , đảm bảo gson có thể map từ json sang object

model.png

Tạo Interfaces để định nghĩa các API cho Webservice

public interface RetrofitWithRxAndroidService {

   @GET("weather")
    Observable<CurrentWeather> getCurrentWeather(@Query("q") String city, @Query("APPID") String apiKey);
}

Khởi tạo retrofit và lấy dữ liệu

 Retrofit retrofit = new Retrofit.Builder()
          .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
          .addConverterFactory(GsonConverterFactory.create())
          .baseUrl("http://api.openweathermap.org/data/2.5/weather")
          .build();

  RetrofitWithRxAndroidService retrofitWithRxAndroidService = retrofit.create(RetrofitWithRxAndroidService.class);
  Observable<CurrentWeather> currentWeatherObservable = retrofitWithRxAndroidService.getCurrentWeather("HaNoi");

  currentWeatherObservable.subscribeOn(Schedulers.newThread())
          .observeOn(AndroidSchedulers.mainThread())
          .subscribe(new Action1<CurrentWeather>() {
                    @Override
                    public void call(CurrentWeather currentWeather) {
                        mTextViewData.setText(currentWeather.getWeather().get(0).getDescription());
                    }
                });

Từ ví dụ trên chúng ta có thể thấy việc kết nối đến Webservice lấy dữ liệu trở nên dễ dàng.

Reference

http://square.github.io/retrofit/

https://github.com/ReactiveX/RxAndroid


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí