0
点赞
收藏
分享

微信扫一扫

rxjava+retrofit基本使用简单手册(没有废话,用于使用时拷贝)


参考文章(代码主要从这里来):
​​​https://www.jianshu.com/p/1fb294ec7e3b​​

  • ​​基本使用​​
  • ​​导入​​
  • ​​请求​​
  • ​​补充retrofit知识​​
  • ​​高级用法​​
  • ​​map-多次请求​​
  • ​​flatMap​​
  • ​​线程​​
  • ​​感想​​


1.基本使用

导入

compile 'io.reactivex:rxjava:x.y.z'
compile 'io.reactivex:rxandroid:1.0.1'
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'

请求

补充retrofit知识:

@GET(“xx/xx”)+@Query(“name”)/@QueryMap()
get请求

@FormUrlEncoded
@Post(“xx/xx”)+@Field(“name”)/@FieldMap()
post请求

@GET/POST(“{url}”)+@Path(“url”)
完整url请求1

@GET/POST+@Url
完整url请求2

interface MyService {
@GET("user/login" )
Observable<UserInfo> login(
@Query("username") String username,
@Query("password") String password
);
}

Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//必须加,这是retrofit和rxjava结合的关键所在
.baseUrl(BASE_URL)
.build();
MyService service = retrofit.create(MyService.class);

service.login(phone, password)
.subscribeOn(Schedulers.newThread())//请求线程
.observeOn(Schedulers.io()) //请求完成回调doOnNext在io线程
.doOnNext(new Action1<UserInfo>() {
@Override
public void call(UserInfo userInfo) {
saveUserInfo(userInfo);//进行io操作,各种存储
}
})
.observeOn(AndroidSchedulers.mainThread())//subscribe所在线程
.subscribe(new Subscriber<UserInfo>() {
@Override
public void onCompleted() {

}

@Override
public void onError(Throwable e) {
//请求失败
}

@Override
public void onNext(UserInfo userInfo) {
//请求成功

高级用法

map-多次请求。

有的时候,我们需要通过请求1的结果来获取请求2,然后请求2的结果来获取处理3,然后只需要处理3的结果,之前的过程并不关心,这时就用到map-多次处理。此时subscribe返回是最后一次处理的结果

//多次使用map,想用几个用几个
Observable.just("Hello", "World")
.map(new Func1<String, Integer>() {//将String类型的转化为Integer类型的哈希码
@Override
public Integer call(String s) {
return s.hashCode();
}
})
.map(new Func1<Integer, String>() {//将转化后得到的Integer类型的哈希码再转化为String类型
@Override
public String call(Integer integer) {
return integer.intValue() + "";
}
})
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.i(TAG, s);
}
});

flatMap()

这东西其实是集合处理,和请求没什么关系,就是把集合变成单个,一个个进行输出,比较喜欢一个比喻叫做平铺,flatMap是把集合平铺的过程:
以下代码来自:​​​https://www.jianshu.com/p/52cd2d514528​​

作者提出flatMap是会乱序的,为了不乱序,可以用concatMap。感觉flatMap()应该可能只用于单纯的费用叠加或者获取最大值等计算【不知道会不会产生并发问题?】,如果返回字段集合那应该用concatMap,很多东西都很介意顺序的。以下student对应一个课程表集合,需要获取对应的课程表名称。

Observable.from(students)
.flatMap(new Func1<Student, Observable<Course>>() {
@Override
public Observable<Course> call(Student student) {
return Observable.from(student.getCoursesList());
}
})
.subscribe(new Action1<Course>() {
@Override
public void call(Course course) {
Log.i(TAG, course.getName());
}
});

线程

一般会有这几句,subscribeOn是操作线程,onserverOn是回调线程

当前线程:Schedulers.immediate()
子线程:Schedulers.newThread()
io线程:Schedulers.io()
计算线程:Schedulers.computation()
主线程:AndroidSchedulers.mainThread()

xx
.subscribeOn(Schedulers.newThread())
.observeOn(Schedulers.io())

subscribeOn只使用一次,map/flatMap需要进行observeOn,subscribe也需要进行observeOn,所以observeOn是可以执行多次的。

感想

rxjava不单单可用于网络请求,也可以用于集合单字段分化,特殊费用计算等方面。


举报

相关推荐

0 条评论