RxJava+Retrofit初體驗(一)

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
當然,我這個demo只是一個簡單配合的請求,如果你的項目中遇到更多或者更復雜的你可以對請求進行封裝,返回結果進行封裝,萬變不離其宗只要理解了他們怎么用我想那也不會是難事,希望可以和各位兄弟共同學習!!!######
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容