Retrofit與RxJava實踐

首先添加Retrofit依賴

compile 'com.squareup.retrofit2:retrofit:2.1.0'

Retrofit通過接口來管理HTTP API,那麼首先我們先定義一個API的接口:

public interface ZhihuApi {

    @GET("/api/4/news/latest")//GET方法這裏可以換成不同的HTTP請求
    Observable<ZhihuDaily> getLastDaily();

}

然後通過Retrofit.Builder獲取到Retrofit實例,並通過create(class)方法獲取到我們剛纔創建的RetrofitApi接口實例:

Retrofit retrofit=new Retrofit.Builder()
        .baseUrl("http://news-at.zhihu.com")
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())                               .addConverterFactory(GsonConverterFactory.create())
.build();

RetrofitApi retrofitApi=retrofit.create(ZhihuApi.class);

.addConverterFactory方法添加相應結果解析器,存放於Retrofit.Builder類的converterFactories集合中。從Builder的構造方法可以看出創建Builder的時候會自動添加一個默認的ConvertFactory。

addCallAdapterFactory方法添加訪問處理適配器,存放於Retrofit.Builder類的adapterFactories集合中。


得到實例後就可以使用了

subscription= ZhihuManager.getInstance()
                .getZhihuApiService()
                .getLastDaily()
                .subscribeOn(Schedulers.io())//指定Observable事件產生和變換處理的線程
                .observeOn(AndroidSchedulers.mainThread())//指定訂閱者所在的線程
                .subscribe(new Subscriber<ZhihuDaily>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(ZhihuDaily daily) {
                        //get first bean
                        ZhihuDailyItem item=daily.getStories().get(0);
                        printLog("Title:"+item.getTitle());
                        printLog("Data:  "+item.getDate());
                        printLog("Id:    "+item.getId());
                        printLog("Type:  "+item.getType());


                    }
                });

上述接口中的@GET註解也可以是其他的HTTP請求;比如GET,POST,PUT,DELETE,HEAD,PATCH,OPTIONS,HTTP七種請求方法


Retrofit中的標記類註解

Retrofit支持三種標記類註解,分別是:FormUrlEncoded、Multipart、Streaming。

  • FormUrlEncoded 指請求體是一個Form表單,Content-Type=application/x-www-form-urlencoded,需要和參數類註解@Field,@FieldMap搭配使用
  • Multipart 指請求體是一個支持文件上傳的Form表單,Content-Type=multipart/form-data,需要和參數類註解@Part,@PartMap搭配使用
  • Streaming 指響應體的數據以流的形式返回,如果不使用默認會把數據全部加載到內存,所以下載文件時需要加上這個註解

參數類註解

-Headers:添加請求頭,作用於方法

   @Headers("Cache-Control: max-age=640000")
   @GET("/api/4/news/latest")
   Observable<ZhihuDaily> getLastDaily();

-Header:用於動態添加頭部,作用於方法參數

   @Headers("Cache-Control: max-age=640000")
   @GET("/api/4/news/latest")
   Observable<ZhihuDaily> getLastDaily(@Header("Token") String token);

-Body:用於非表單請求體,作用於方法參數

@GET("/api/4/news/latest")
   Observable<ZhihuDaily> getLastDaily(@Body User user);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章