Retrofit2.0的簡單使用

上一篇博客寫的是okhttp,接下來打算記錄Retrofit2.0的學習,如有不足之處,還望指點一二。

在build.gradle中添加依賴:

   compile "com.squareup.retrofit2:retrofit:2.1.0"
    compile "com.squareup.retrofit2:converter-gson:2.1.0"
    compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'

這裏用的實例是一個get請求的接口,baseUrl傳的是主機地址+端口號,interface裏面傳的是後綴。

    public interface Service {
        //GET請求
        /**
         * 當URL問號後面的參數存在時,就@Query傳遞參數,
         * 比如https://www.baidu.com/s?wd=android,就傳getData(@Query("wd") String wd);
         */
        @GET("api/recommendations")
        //Call<ResponseBody> getData(@Query("參數名")String"自己定義的變量");
        Call<ResponseBody> getData();

        //Retrofit註解之HTPP請求法
//        @HTTP(method = "GET", path = "api/recommendations", hasBody = false)
//        Call<ResponseBody> getData();
    }

    private void Test() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://baiting.longruncloud.com/")
                .build();
        //無法直接調用Service接口裏面的方法,我們需要自己創建代理對象service來調用
        Service service = retrofit.create(Service.class);
        Call<ResponseBody> call = service.getData();
        // 用法和OkHttp的call一致,只是我們不需要自己再寫子線程到主線程的回調,具體原因上一篇博客有講到
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(
                    Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    Log.e("response", response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                t.printStackTrace();
            }
        });
    }

默認情況下Retrofit只支持將HTTP的響應體轉換爲ResponseBody,而Converter可以將Response轉換爲我們想要的類型,即是把<Response>替換成實體類。

依賴: compile "com.squareup.retrofit2:converter-gson:2.1.0",前面已添加過,其中包裏面已經寫好了Gson解析,具體實現如下:

public interface Service {
        //GET請求
        @GET("api/recommendations")
        Call<RecommendationBean> getData();
    }
  
    private void Test() { 
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://baiting.longruncloud.com/")
                .addConverterFactory(GsonConverterFactory.create())//爲retrofit添加Gson支持
                .build();
        Service service = retrofit.create(Service.class);
        Call<RecommendationBean> call = service.getData();
        call.enqueue(new Callback<RecommendationBean>() {
            @Override
            public void onResponse(Call<RecommendationBean> call, Response<RecommendationBean> response) {
                RecommendationBean body = response.body();
                Log.e("body", body.getCarousels().get(0).getImage());//打印出來是以圖片地址

            }

            @Override
            public void onFailure(Call<RecommendationBean> call, Throwable t) {
                t.printStackTrace();
            }
        });
    }

RecommendationBean是打開url得到的實體類,到這裏就是okhttp+retrofit的初步使用。而常與之一起使用的是Rxjava,Rxjava是一個響應式框架,採用觀察者設計模式,很方便的實現了異步,這裏以Rxjava爲例,用Observer代替Call。

引入依賴:compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0',以上代碼改寫爲:

  public interface Service {
        //GET請求
        @GET("api/recommendations")
        Observable<RecommendationBean> getData();
    }

    private void Test() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://baiting.longruncloud.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//RxJavaCallAdapterFactory爲Retrofit添加RxJava支持
                .build();
        //無法直接調用Service接口裏面的方法,我們需要自己創建代理對象service來調用
        Service service = retrofit.create(Service.class);
        service.getData().subscribeOn(Schedulers.io()).subscribe(new Subscriber<RecommendationBean>() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted");
            }

            @Override
            public void onError(Throwable e) {
                System.err.println("onError");
            }

            @Override
            public void onNext(RecommendationBean recommendationBean) {
                System.out.println(recommendationBean);
                Log.e("carouselsBean", recommendationBean.getCarousels().get(0).getImage());
            }
        });
    }

把學習所得記下來,和大家共勉p( ^ O ^ )q



發佈了45 篇原創文章 · 獲贊 12 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章