RxJava火了有好长一段时间了,我想大多数了解的小伙伴都是看这篇文章的: 扔物线的给Android开发者的RxJava详解,Retrofit的话自从它出来就一直是很主流的网络请求框架官网的栗子,是从okhttp进化而来,这几个库的配合也是很常见。现在github上面好多的开源项目用的都是什么Rxjava+Retrofit+MVP这些骚框架,看见都害怕,瞬间感觉自己奥特了。就写了这么一个简单的接触这些的一个栗子github项目。####
首先配置依赖在build.gradle里面添加:######
dependencies {
compile 'com.squareup.okhttp3:okhttp:3.4.1' //配置retrofit的时候配置基于okhttpclient
compile 'com.squareup.retrofit2:retrofit:2.1.0
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.6'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' //Rx和Retrofit配合使用必须添加此依赖
compile 'com.squareup.retrofit2:converter-gson:2.1.0' //使用Gson自动解析,在retrofit进行配置
}
开始写代码 定义请求接口(以retrofit的get请求为例去请求http://gank.io/api/day/history ):######
public interface GitHubService {
@GET("api/day/history")
Observable<DayInfo> getDayInfo();//retrofit允许我们使用Rxjava,因此请求会给我们返回Observable对象
}
接下来我们要去配置retrofit网络请求了######
public class RetrofitManager {
public static OkHttpClient client = null;
public static Retrofit retrofit = null;
public static final String BASE_URL = "http://gank.io/";
public static GitHubService service = null;
public static OkHttpClient getOkHttpClient(){//根据你自己的实际情况去进行配置,这里只是一个简单的配置
if (client == null){
client = new OkHttpClient().newBuilder()
//.readTimeout(5000, TimeUnit.MILLISECONDS)
.build();
}
return client;
}
public static Retrofit getRetrofit(){
if (retrofit == null){
retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create()) //配置使用Gson进行解析,请求成功返回的结果不需要再用gson去解析,写好json bean之后会直接解析成bean,这就是之前依赖gson那个原因
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//这也是必须配置的,rx和retrofit使用才会兼容,不然会报错。
.baseUrl(BASE_URL)
.client(getOkHttpClient()) //将配置的client添加进来
.build();
}
return retrofit;
}
public static GitHubService getService(){
if (service == null) {
service = getRetrofit().create(GitHubService.class); //获取GitHubService
}
return service;
}
}
最后我们要通过getService()方法得到GitHubService接口并且去调用网络请求的方法:######
我们在MainActivity中写了这么一个网络请求的方法:
private void getDayInfoFromNet() {
mSubscribe = RetrofitManager
.getService() //得到GitHubService接口
.getDayInfo() //调用getDayInfo方法
.subscribeOn(Schedulers.io()) //因为它返回的是一个observer对象我们就可以用Rx来处理了,异步操作放在io线程,内部是线程池实现
.observeOn(AndroidSchedulers.mainThread()) //subscribe的回调在主线程
.subscribe(new Subscriber<DayInfo>() {
@Override
public void onStart() { //此方法是在订阅之前回调的,我们可以在里面处理一些简单的逻辑
super.onStart();
mProgressBar.setVisibility(View.VISIBLE);
}
@Override
public void onCompleted() {
mProgressBar.setVisibility(View.GONE);
}
@Override
public void onError(Throwable e) {
mProgressBar.setVisibility(View.GONE);
}
@Override
public void onNext(DayInfo dayInfo) { //成功之后我们会得到gson解析的bean
List<String> datas = dayInfo.getResults();
if (mAdapter == null) {
mAdapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, datas);
}
mListView.setAdapter(mAdapter);
}
});
}
完事儿后我们可以在onDestroty里面取消注册######
@Override
protected void onDestroy() {
if (mSubscribe.isUnsubscribed()){
mSubscribe.unsubscribe();
}
}