参开文章: 主要是扔物线大神给安卓开发者的详解,还有很多很多的文章;然后我这边就只写我自己的代码,网上很多文章都很好完全能够明白.
项目准备使用RxJava,RxAndroid,Retrofit开发,然后就自己研究了几天,今天开始项目,就网络下载进行了分装,然后结合各路大神的文章,还有知乎的一些做了这个.
主要是
这个主要是就是对下载进行一个封装,然后就是可以根据json格式进行转换,主要是相同部分,开始的位置进行下载成功与否的判断,然后把data部分保留下来,用到了一个map的操作符.剩下的就是基本都一样,下载完事之后进行调用就OK了;
比如类似这种格式的
{
"code": "2",
"message": "OK",
"data": "数据",
}
下面是项目的代码直接上
- 添加依赖
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.6'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1'
compile 'com.squareup.retrofit2:converter-gson:2.0.1'
添加依赖的时候好多人说的不是很一样,然后我自己的话就这样添加的,至于为啥,我也不知道,这个目前没有错, 也不知道是不是对的(当然我的下载是没有问题的)
-
然后就是弄了三个类
-
ApiService.class
这个类主要是,,,,看代码就行了,,, 请求前面不要加"/",添加会报404,这个要注意,也可加添加Headers,我实在代码设置Okhttp的时候添加的;
@GET("test")
Observable getTest(@Query("a") int a);
就是这样的一个get请求,后面的大家应该都知道
- HttpRetrofit.class
这个类主要就是进行一些初始化.然后就是设置一些东西,然后就是绑定订阅, 这边的话是把Observable和Subscriber设置了泛型T进行连接,这样的话早设置线程转换的时候就不用重复添加代码了.看代码
/**
* Created by zhiguo on 2016/7/11.
* 封装了一个RX系列网络下载的类 这边主要是做一些配置和初始化
*/
public class HttpRetrofit{
private static OkHttpClient okHttpClient;
public HttpRetrofit(){
okHttpClient = new OkHttpClient();
setOkHttpClient();
}
/**
* 设置调用OkHttpClient
*/
private void setOkHttpClient(){
okHttpClient.newBuilder()
.addInterceptor(loggingInterceptor)
.retryOnConnectionFailure(true)
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request()
.newBuilder()
.build();
return chain.proceed(request);
}
});
}
/**
* 初始化retrofit
* @return
*/
public Retrofit getRetrofit(){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.lafeng.com/") //服务器地址
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
return retrofit;
}
/**
* 封装调用 主要是设置订阅的线程转换
* @param observable
* @param subscriber
* @param
*/
public void httpSubscribe(Observable observable, Subscriber subscriber){
observable
.map(new Func1() {
@Override
public T call(T t) {
//在这里进行转化, 进行json外层部分的判断并返回
return t;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.unsubscribeOn(Schedulers.io())
.subscribe(subscriber);
}
/**
* 关联接口类
* @return
*/
public ApiService getApiService(){
return getRetrofit().create(ApiService.class);
}
}
我的注释不是很多,基本都能明白,不过还是有一些坑的
- HttpPost.class
最后就是这个类,这个类是要是为了方便调用和统一管理,看一下就明白了,方便管理,可能也不是很有用
/**
* Created by zhiguo on 2016/7/11.
* 这个类只要是设置下载返回的类 返回的结果在Subscriber
*/
public class HttpPost {
private static HttpRetrofit httpRetrofit = new HttpRetrofit();
public static void getTest(Subscriber subscriber){
httpRetrofit.httpSubscribe(httpRetrofit.getApiService().getTest(0),subscriber);
}
}
好了,代码就这些,然后就是TestBean.class,这个类随便搞;
调用是这样的
HttpPost.getTest(new Subscriber() {
@Override
public void onNext(TestBean t) {
textView.setText(t.toString());
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
});
好,完事了,基本是可以的用的,其他的细节方面在弄弄;
网友评论