RxJava&Retrofit

来源:互联网 发布:日本电影翻译软件 编辑:程序博客网 时间:2024/06/05 02:26

Retrofit 的 Converter 是对于 Call<T> 中 T 的转换,而 CallAdapter 则可以对 Call 转换。Retrofit 提供了多个 CallAdapter,为 RxJava 提供了 Observable 形式 API:

Retrofit retrofit = new Retrofit.Builder()      .baseUrl("http://localhost:4567/")      .addConverterFactory(GsonConverterFactory.create())      // 添加 RxJava 支持      .addCallAdapterFactory(RxJavaCallAdapterFactory.create())      .build();

以获取一个 User 对象的接口作为例子。
使用 Retrofit 的传统 API:

// 定义请求 Service@GET("/user")public void getUser(@Query("userId") String userId, Callback<User> callback);// 调用getUser(userId, new Callback<User>() {    @Override    public void success(User user) {        userView.setUser(user);    }    @Override    public void failure(RetrofitError error) {        // Error handling        ...    }};

使用 RxJava 形式的 API:

@GET("/user")public Observable<User> getUser(@Query("userId") String userId);// RxJava 的链式调用getUser(userId)    .observeOn(AndroidSchedulers.mainThread())    .subscribe(new Observer<User>() {        @Override        public void onNext(User user) {            userView.setUser(user);        }        @Override        public void onCompleted() {        }        @Override        public void onError(Throwable error) {            // Error handling            ...        }    });

再举一个例子:假设 /user 接口并不能直接访问,而需要填入一个在线获取的 token。

Callback 方式,可以使用嵌套的 Callback:

@GET("/token")public void getToken(Callback<String> callback);@GET("/user")public void getUser(@Query("token") String token, @Query("userId") String userId, Callback<User> callback);...getToken(new Callback<String>() {    @Override    public void success(String token) {        getUser(token, userId, new Callback<User>() {            @Override            public void success(User user) {                userView.setUser(user);            }            @Override            public void failure(RetrofitError error) {                // Error handling                ...            }        };    }    @Override    public void failure(RetrofitError error) {        // Error handling        ...    }});

而使用 RxJava 的话,代码是这样的:

@GET("/token")public Observable<String> getToken();@GET("/user")public Observable<User> getUser(@Query("token") String token, @Query("userId") String userId);...// getToken 获取到 token 后 flatMap 转换成 UsergetToken()    .flatMap(new Func1<String, Observable<User>>() {        @Override        public Observable<User> onNext(String token) {            return getUser(token, userId);        })    .observeOn(AndroidSchedulers.mainThread())    .subscribe(new Observer<User>() {        @Override        public void onNext(User user) {            userView.setUser(user);        }        @Override        public void onCompleted() {        }        @Override        public void onError(Throwable error) {            // Error handling            ...        }    });

参考:
给 Android 开发者的 RxJava 详解
你真的会用Retrofit2吗?Retrofit2完全教程

0 1
原创粉丝点击