Retrofit+RxJava学习笔记(1)
最近做项目发现,项目的上传图片功能有问题
各种输入流,输出流的操作。博主看着都头疼。
于是决定换个网络框架上传。于是就选择了Retrofit(+RxJava)
先用登陆练个手
Retrofit:
第一步:创建Retrofit实例
BaseURL是你请求的基地址
//创建Retrofit实例 Retrofit retrofit = new Retrofit.Builder() .baseUrl(URL.BaseURL) .addConverterFactory(GsonConverterFactory.create())//配置gson转换 .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//配置rxjava转换 .build();
第二步:定义接口(这里是配合RxJava使用,所以返回的是Observable)
泛型是返回json对应的JavaBean
@GET注解表示请求方式(get请求)
括号中的是接口链接(这里我写死了一个参数OSType(拼接键值对),也可以放到login的参数中)
这个接口需要三个参数:userName,userPwd,OSType
使用@Query注解可以避免拼接参数(OSType),你只需传入指定参数即可
@Query后面跟的字符串就是接口对应的字段(注意不要打错!!!!复制,粘贴!!!!)
public interface RetrofitService {
//http://192.168.1.181:8083/zsfcsmss/ @GET("appHnt/AppLogin?OSType=2") Observable<UserInfoData1> login(@Query("userName") String userName, @Query("userPwd") String passWord);}
第三步:创建接口实例
//创建接口实例 RetrofitService retrofitService = retrofit.create(RetrofitService.class);
第四步:发起请求(调用接口中的方法)
配合Rxjava使用
1.指定订阅线程
2.订阅观察者
请求成功会回掉onNext()方法,失败则回掉onError
retrofitService.login(username, password) .subscribeOn(Schedulers.newThread())//指定事件订阅在IO线程 .subscribe(new Observer<UserInfoData1>() { @Override public void onSubscribe(@NonNull Disposable d) { //检查网络状态 if (!NetworkUtils.isConnected(LoginActivity.this)) { } } @Override public void onNext(@NonNull UserInfoData1 userInfoData) { Log.e(TAG, "onNext"); } @Override public void onError(@NonNull Throwable e) { Log.e(TAG, "onError"); } @Override public void onComplete() { Log.e(TAG, "onComplete"); } });
RxJava:
使用RxJava要先弄清楚几个概念:
1.Observable(被观察者)
2.Observer(观察者)
3.subscribe(订阅)
4.Event(事件)
Observable(被观察者)通过subscribe(订阅)Observer(观察者)
即被观察者通过订阅(动作)观察者,和观察者产生联系
下图可以看出:
1.发生了登陆事件(login)>>>>>>>>>>>>>>Event(事件)
2.登陆方法返回了一个被观察者 >>>>>>>>>>>>>>Observable(被观察者)
3.被观察者通过subscribe方法订阅了观察者>>>>>>>>>>>>>>subscribe(订阅),Observer(观察者)
使用Rxjava怎么能少了链式编程呢?
new Retrofit.Builder() .baseUrl(URL.BaseURL) .addConverterFactory(GsonConverterFactory.create())//配置gson转换 .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//配置rxjava转换 .build() .create(RetrofitService.class) .login(username, password) .subscribeOn(Schedulers.newThread())//指定事件订阅在IO线程 .subscribe(new Observer<UserInfoData1>() { @Override public void onSubscribe(@NonNull Disposable d) { //检查网络状态 if (!NetworkUtils.isConnected(LoginActivity.this)) { } } @Override public void onNext(@NonNull UserInfoData1 userInfoData) { Log.e(TAG, "onNext"); } @Override public void onError(@NonNull Throwable e) { Log.e(TAG, "onError"); } @Override public void onComplete() { Log.e(TAG, "onComplete"); } });