自己手打的Retrofit2+Rxjava 2結合的案例

自己也是最近幾天看了相關的文章,就嘗試寫了一下,有點小激動,純粹是爲了記錄一下

一.依賴如下



二。直接上正題

1.url用的是豆瓣的:

BASE_URL = "https://api.douban.com/v2/movie/"
配置retrofit
public class HttpMethods {
    public static final String BASE_URL = "https://api.douban.com/v2/movie/";

    private static final int DEFAULT_TIMEOUT = 5;
    private Retrofit retrofit;
    private MovieService movieService;

    private HttpMethods() {
        //手動創建一個OkHttpClient並設置超時時間
        OkHttpClient mOkHttpClient = new OkHttpClient.Builder()
                .connectTimeout(HttpConfig.HTTP_TIME, TimeUnit.SECONDS)//設置連接超時時間
                .readTimeout(HttpConfig.HTTP_TIME, TimeUnit.SECONDS)//設置讀取超時時間
                .writeTimeout(HttpConfig.HTTP_TIME, TimeUnit.SECONDS)//設置寫入超時時間
//                .addInterceptor(InterceptorUtil.HeaderInterceptor())//添加其他攔截器
                .addInterceptor(InterceptorUtil.LogInterceptor())//添加日誌攔截器
                .build();


        retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                //這裏就是retrofit和rxjava扯上關係了
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .baseUrl(BASE_URL)
                .client(mOkHttpClient)
                .build();
        movieService = retrofit.create(MovieService.class);

    }


    //在訪問HttpMethods時創建單例
    private static class SingletonHolder {


        private static final HttpMethods INSTANCE = new HttpMethods();
    }

    //獲取單例
    public static HttpMethods getInstance() {
        return SingletonHolder.INSTANCE;
    }

    public MovieService API() {
        return movieService;
    }


    /**
     * 用於獲取豆瓣電影Top250的數據
     *  @param
     * @param start      起始位置
     * @param count      獲取長度
     */
    public void getTopMovie(Subscriber<MovieEntity> subscriber, int start, int count){
        movieService.getTopMovie(start, count)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(subscriber);
    }
2.定義api
public interface MovieService {
    @GET("top250")
    Flowable<MovieEntity> getTopMovie(@Query("start") int start, @Query("count") int count);

MovieEntity爲具體的實體類,我就不貼出來了
3.高潮來了
/**
 * 第一種retrofit2 和Rxjava2 結合成功獲取數據的方案
 */
HttpMethods.getInstance().API()
        .getTopMovie( 0, 10)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Consumer<MovieEntity>() {
            @Override
            public void accept(MovieEntity movieEntity) throws Exception {
                MovieEntity ob  = movieEntity;
                List<MovieEntity.SubjectsBean> subjects  = ob.getSubjects();
                tv_title.setText(subjects.get(2).getTitle());
            }
        });


/**
 * 第二種retrofit2 和Rxjava2 結合成功獲取數據的方案
 */
HttpMethods.getInstance().API()
        .getTopMovie( 0, 10)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Subscriber<MovieEntity>() {
            @Override
            public void onSubscribe(Subscription s) {
              //這裏注意了,一定要設置,只有設置了,接下來的方法纔會被調用
                s.request(Long.MAX_VALUE);
                tv_title.setText("I got it ");
            }

            @Override
            public void onNext(MovieEntity movieEntity) {
                MovieEntity ob  = movieEntity;
                List<MovieEntity.SubjectsBean> subjects  = ob.getSubjects();
                tv_title.setText(subjects.get(2).getTitle());
            }

            @Override
            public void onError(Throwable t) {
                tv_title.setText(" a error");
            }

            @Override
            public void onComplete() {
                tv_title.setText("it is finished");
            }
        });

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章