通过一段时间的学习,Rxjava Retrofit2终于算是入了门,学习的过程中写了个简单的小例子,像我这样的人学习东西还是喜欢有一个正确的例子用来学习的。
本demo已经上传到了gitHup:
java服务器 :https://github.com/tanglonghui/Retrofit2Server
安卓客户端:https://github.com/tanglonghui/Retrofit2Study
千山万水总是情,给个star行不行
写篇博客总还是要有点东西的,就贴两个代码地址有点虚,顺便再巩固一下自己所学。
总的来说,这是一篇面向菜鸟的文章,只有菜鸟才知道菜鸟需要什么。
一、环境搭建
安卓:既然要用Rxjava Retrofit2 几个包还是要有的
//retrofit2依赖
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
//rxjava2依赖
compile 'io.reactivex.rxjava2:rxjava:2.1.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
//听说可以用来解决适配性问题
compile'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
服务器:
用了三个jar包,前两个是解决文件上传的,后一个大家都知道。
想学么?想学的话就去百度吧,我也不会。
二、Retrofit2 网络请求
打字好累啊,没有耐心与实力的人真可怕。
来大家跟我一起做。
1.搞一个网络请求接口 interface
public interface GetUserService {
//0.简单的get请求 通过get请求一个User 模仿token验证
@GET("UserServelt")
Call<User> getUser(@Header("token") String token);
}
@get :表示get请求
“Userservelt” :与下文的baseUrl组成一个完整的Url。
Call<User> : Retrofit2标准配置 <>中放你想要的数据格式。
@Header(“token”) :请求头中带一个token
2.搞一个Api
public class Api {
private static String baseUrl="http://192.168.1.101:8080/Retrofit2Server/";
/*
* 同一获得网络请求的接口
* baserUrl 需按实际情况更改
*/
public static GetUserService getUserService(){
Retrofit retrofit=new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
GetUserService getUserService=retrofit.create(GetUserService.class);
return getUserService;
}
}
这个是不是叫封装0。0,反正都是这么做的
3.发起网络请求
case R.id.button:
Api.getUserService().getUser("1433227").enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
Toast.makeText(MainActivity.this, "结果" + response.body(), Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(Call<User> call, Throwable t) {
Toast.makeText(MainActivity.this, "结果失败", Toast.LENGTH_SHORT).show();
}
});
break;
这个是异步请求。
三、Rxjava+Retrofit2网络请求
同样
1.搞一个接口 interface
public interface RxjavaGetService {
/*
* rxjava 用来替换Call的有两个 Flowable 支持背压 Observable 不支持背压 但正常情况下 开销低一些
* 根据 选择 使用 .subscribe(new Subscriber<User>(){}) 或 .subscribe(new Observer<User>(){}}
*/
//0.简单的get请求 通过get请求一个User 模仿token验证
@GET("UserServelt")
Flowable<User> getUser(@Header("token") String token);//Flowable支持背压
}
也没变多少,就call<User> 换成 Rxjava 给你提空的东东
2.搞一个api
public class Api {
private static String baseUrl="http://192.168.1.101:8080/Retrofit2Server/";
/*
* 同一获得网络请求的接口
* baserUrl 需按实际情况更改
*/
public static GetUserService getUserService(){
Retrofit retrofit=new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
GetUserService getUserService=retrofit.create(GetUserService.class);
return getUserService;
}
public static RxjavaGetService RxjavaGetService (){
Retrofit retrofit=new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())//Rxjava适配
.build();
RxjavaGetService rxjavaGetService=retrofit.create(RxjavaGetService.class);
return rxjavaGetService;
}
}
你可以观察一下,其实也没多大差别,就是多了一层Rxjava适配
3.网络请求
case R.id.button:
//正确返回依次走 124 错误直接进3
Api.RxjavaGetService().getUser("1433223")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<User>() {
@Override
public void onSubscribe(Subscription s) {
/*
吃了英语的亏,大概,感觉是推荐我们用这个值吧
大概是设置背压什么的
*/
s.request(Long.MAX_VALUE);
Toast.makeText(Main2Activity.this, "1", Toast.LENGTH_SHORT).show();
}
@Override
public void onNext(User user) {
//在这里进行返回消息出来
Toast.makeText(Main2Activity.this, "2", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Throwable t) {
//错误走这里
Toast.makeText(Main2Activity.this, "3", Toast.LENGTH_SHORT).show();
}
@Override
public void onComplete() {
Toast.makeText(Main2Activity.this, "4", Toast.LENGTH_SHORT).show();
}
});
break;
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
百度应该知道上面那两个东西是干什么的
一个io的计划,一个主线程运行啥的。。。。。
写点什么就觉得很累,才能不足吧,毕竟自己也才是了解介个是什么,那个是什么,真要解释是什么,脑子里也没有多少货,
CV程序员,
努力不一定成功,但放弃绝对很轻松。
哈哈~~~~