參開文章: 主要是扔物線大神給安卓開發(fā)者的詳解,還有很多很多的文章;然后我這邊就只寫我自己的代碼,網(wǎng)上很多文章都很好完全能夠明白.
項(xiàng)目準(zhǔn)備使用RxJava,RxAndroid,Retrofit開發(fā),然后就自己研究了幾天,今天開始項(xiàng)目,就網(wǎng)絡(luò)下載進(jìn)行了分裝,然后結(jié)合各路大神的文章,還有知乎的一些做了這個(gè).
主要是
這個(gè)主要是就是對下載進(jìn)行一個(gè)封裝,然后就是可以根據(jù)json格式進(jìn)行轉(zhuǎn)換,主要是相同部分,開始的位置進(jìn)行下載成功與否的判斷,然后把data部分保留下來,用到了一個(gè)map的操作符.剩下的就是基本都一樣,下載完事之后進(jìn)行調(diào)用就OK了;
比如類似這種格式的
{
"code": "2",
"message": "OK",
"data": "數(shù)據(jù)",
}
下面是項(xiàng)目的代碼直接上
- 添加依賴
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'
添加依賴的時(shí)候好多人說的不是很一樣,然后我自己的話就這樣添加的,至于為啥,我也不知道,這個(gè)目前沒有錯(cuò), 也不知道是不是對的(當(dāng)然我的下載是沒有問題的)
-
然后就是弄了三個(gè)類
ApiService.class
這個(gè)類主要是,,,,看代碼就行了,,, 請求前面不要加"/",添加會(huì)報(bào)404,這個(gè)要注意,也可加添加Headers,我實(shí)在代碼設(shè)置Okhttp的時(shí)候添加的;
@GET("test")
Observable getTest(@Query("a") int a);
就是這樣的一個(gè)get請求,后面的大家應(yīng)該都知道
- HttpRetrofit.class
這個(gè)類主要就是進(jìn)行一些初始化.然后就是設(shè)置一些東西,然后就是綁定訂閱, 這邊的話是把Observable和Subscriber設(shè)置了泛型T進(jìn)行連接,這樣的話早設(shè)置線程轉(zhuǎn)換的時(shí)候就不用重復(fù)添加代碼了.看代碼
/**
* Created by zhiguo on 2016/7/11.
* 封裝了一個(gè)RX系列網(wǎng)絡(luò)下載的類 這邊主要是做一些配置和初始化
*/
public class HttpRetrofit{
private static OkHttpClient okHttpClient;
public HttpRetrofit(){
okHttpClient = new OkHttpClient();
setOkHttpClient();
}
/**
* 設(shè)置調(diào)用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/") //服務(wù)器地址
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
return retrofit;
}
/**
* 封裝調(diào)用 主要是設(shè)置訂閱的線程轉(zhuǎn)換
* @param observable
* @param subscriber
* @param
*/
public void httpSubscribe(Observable observable, Subscriber subscriber){
observable
.map(new Func1() {
@Override
public T call(T t) {
//在這里進(jìn)行轉(zhuǎn)化, 進(jìn)行json外層部分的判斷并返回
return t;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.unsubscribeOn(Schedulers.io())
.subscribe(subscriber);
}
/**
* 關(guān)聯(lián)接口類
* @return
*/
public ApiService getApiService(){
return getRetrofit().create(ApiService.class);
}
}
我的注釋不是很多,基本都能明白,不過還是有一些坑的
- HttpPost.class
最后就是這個(gè)類,這個(gè)類是要是為了方便調(diào)用和統(tǒng)一管理,看一下就明白了,方便管理,可能也不是很有用
/**
* Created by zhiguo on 2016/7/11.
* 這個(gè)類只要是設(shè)置下載返回的類 返回的結(jié)果在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,這個(gè)類隨便搞;
調(diào)用是這樣的
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();
}
});
好,完事了,基本是可以的用的,其他的細(xì)節(jié)方面在弄弄;