最開始接觸Android的時候使用的是 android-async-http,後來轉戰到了volley,最後發現retrofit+Rxjava實在火的不行,所以就開始接觸這個框架。因爲本人在剛開始學習這一塊的時候沒有頭緒,網上找的感覺有點亂,對於新手的話可能看着會有寫懵逼,所以在這裏分享一下自己摸索的比較清晰的思路。
這裏我就不說了單純的retrofit了,又不懂的可以google一下,應該能理解。
1.這裏直接在網上找了個網站https://api.douban.com/v2/movie/top250?start=10&count=11
導包:compile 'io.reactivex:rxjava:1.2.2'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.0'
添加網絡權限<uses-permission android:name="android.permission.INTERNET" />
未封裝:
1.新建一個接口IRequestParams ,這裏主要放置的是請求方式和請求參數和請求url?前的一段(開發過程中url會有一部分不一樣,就可以放在這裏進行區分。
比如:https://api.douban.com/v2/movie/top250?和https://api.douban.com/v2/movie/top205?)
`public interface IRequestParams {
@GET("top250")
Observable<DateBean> getInfo(@Query("start") int start, @Query("count") int count);
}
2.
package com.test.user.retrofit20.test;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import com.test.user.retrofit20.R;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class InfoActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_info);
//這裏對retrofit進行初始化 創建一個gson轉換工廠,RxJava也是用的call,不過它對call進行了優化,
//通過map將response轉換爲自定義的Result的response,然後在請求成功後得到框架返回給我們的observable
//然後就可以在onnext中進行操作
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.douban.com/v2/movie/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
//創建一個接口
IRequestParams iRequestParams = retrofit.create(IRequestParams.class);
//通過接口中的方法,得到 Observable<DateBean> 即被觀察者對象
Observable<DateBean> observable = iRequestParams.getInfo(0,10);
//將主線程作爲觀察者,然後進行觀察者雨被觀察者的訂閱
observable.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<DateBean>() {
@Override
public void onCompleted() {
Log.e("tag", "onCompleted");
}
@Override
public void onError(Throwable e) {
Log.e("tag", "onError" + e.getMessage()+"--"+e.getLocalizedMessage());
}
@Override
public void onNext(DateBean dateBean) {
Log.e("tag", "onNext");
}
});
}
}
註解:rxjava這裏用到的是觀察者模式,以上的註釋是個人的理解,如果有錯誤的希望大神們可以評論指導下(蟹蟹啦)
這就是爲封裝的retrofit+rxjava 是不是已經着急嘗試了呢,彆着急下面還有更好的呢–
簡單封裝
1.IRequestParams這個接口不用修改
2.新建一個類,裏面對網絡的請求進行封裝
package com.test.user.retrofit20.test;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class HttpMethod {
private static final String URL = "https://api.douban.com/v2/movie/";
private static final int DEFALUT_TIME = 30;
private Retrofit retrofit;
private IRequestParams requestParams;
private static HttpMethod httpMethod = null;
public HttpMethod() {
OkHttpClient.Builder client = new OkHttpClient.Builder();
client.connectTimeout(DEFALUT_TIME, TimeUnit.SECONDS);
retrofit = new Retrofit.Builder()
.client(client.build())
.baseUrl(URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
requestParams = retrofit.create(IRequestParams.class);
}
public static HttpMethod getInstance() {
if (httpMethod == null) {
synchronized (HttpMethod.class) {
if (httpMethod == null) {
httpMethod = new HttpMethod();
}
}
}
return httpMethod;
}
public <T> void toSubscriber(Observable<T> observable, Subscriber<T> subscriber) {
observable.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
public Observable<DateBean> getTopMovie(int start, int count) {
Observable<DateBean> observable = requestParams.getInfo(start, count);
return observable;
}
}
InfoActivity.class 修改如下
package com.test.user.retrofit20.test;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import com.test.user.retrofit20.R;
import rx.Observable;
import rx.Subscriber;
public class InfoActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_info);
Subscriber<DateBean> subscriber = new Subscriber<DateBean>() {
@Override
public void onCompleted() {
Log.e("tag", "onCompleted");
}
@Override
public void onError(Throwable e) {
Log.e("tag", "onError" + e.getMessage() + "--" + e.getLocalizedMessage());
}
@Override
public void onNext(DateBean dateBean) {
Log.e("tag", "onNext");
}
};
Observable<DateBean> observable = HttpMethod.getInstance().getTopMovie(10, 11);
HttpMethod.getInstance().toSubscriber(observable, subscriber);
}
}
怎麼樣,是不是簡潔了很多,剛學的新框架暫時也就封裝到這一步了,有大神們可以幫忙繼續封裝下。以後如果學習到了更好的,也會和大家分享的。
最後 這一篇博客是我半懂情況下寫的,註釋可能理解的有問題,但是代碼絕對沒問題,都是測試過的。希望對想上手學習retrofit和rxjava的小夥伴有一點幫助.