美文网首页
Android框架第(七)篇---RxJava和Retrofit

Android框架第(七)篇---RxJava和Retrofit

作者: ZebraWei | 来源:发表于2017-12-11 23:55 被阅读37次

**版权声明:本文为小斑马伟原创文章,转载请注明出处!


在第五篇和第六篇博客中,分别介绍了Retrofit基本使用和RxJava的使用。本编博客续写,两者的结合使用的方法。使得网络请求变得更加方便,流程控制更加清晰。
一、添加网络请求权限和依赖

compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'

二、创建Retrofit对象,并添加RxJava的CallAdapter
String baseUrl = "http://192.168.31.242:8080/weiwei/user";
Retrofit retrofit = new Retrofit.Builder()
   .baseUrl(baseUrl)
   .addConverterFactory(GsonConverterFactory.create())
   .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
   .build();

这样使得Retrofit网络请求框架支持RxJava。

三、重新定义接口类,返回值改为Observable
public interface IUserInfo {
    @GET("users")
    Observable<List<User>> getUsers();
 }
四、拿到接口对象的实例
IUserInfo userInfo = retrofit.create(IUserInfo.class);
五、使用RxJava的方式请求网络
userInfo.getUsers()
    .subscribeOn(Schedulers.io())  //IO线程中执行
    .observeOn(AndroidSchedulers.mainThread())  //执行完之后在主线程中处理
    .subscribe(new Subscriber<List<User>> { //被观察者订阅观察者
        @Override
        public void onCompleted() {
            //请求结束
        }
        @Override
        public void onError(Throwable e) {
            //处理错误
        }
        @Override
        public void onNext(List<User> users) {
            //处理请求结果
        }
    }); 
)

使用RxJava和Retrofit相结合发起POST请求实现登录功能

/**发起POST请求实现登录**/
private void login() {
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://35.185.149.228")
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();
    IUSerLogin userLogin = retrofit.create(IUSerLogin.class);

    userLogin.login("weiwei","123")
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
             .subscribe(new Subscriber<RespLoginModel>() { //被观察者去订阅观察者
                 @Override
                 public void onCompleted() {

                 }

                 @Override
                 public void onError(Throwable e) {

                 }

                 @Override
                 public void onNext(RespLoginModel respLoginModel) {
                       Log.i("weiwei","onNext"+respLoginModel.toString());
                 }
             });
}

public class RespLoginModel {
    public  int status;
    public  User data;
}

private class User {
    /**
     * 'id'     :用户id
     * 'username'    :用户名
     * 'avatar'       : 用户默认头像路径
     * 'token'        :用户token
     */
    private String id;
    private String  username;
    private String  avatar;
}

public interface  IUSerLogin {
    @POST("/user/do-login")
    @FormUrlEncoded
    Observable<RespLoginModel> login(@Field("login_username") String username, @Field("login_password") String password);
}

RxJava和Retrofit结合使用,使得网络请求变得更加方便,流程控制更加清晰,而且可以发挥RxJava极大的优势。它的线程控制变得简单,由于定的接口对象是被观察者所有在调用接口对象时可以指定它数据请求在子线程中,然后界面的更新,观察者接受到数据进行处理是在主线程中,通过subscribeOn方法和observeOn方法轻松的做到线程控制。

相关文章

网友评论

      本文标题:Android框架第(七)篇---RxJava和Retrofit

      本文链接:https://www.haomeiwen.com/subject/vatgixtx.html