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();
}
}
效果圖######
simple.png