RxJava+Retrofitの滝の流れDemo

4282 ワード

前言
RxJava+Retrofitの開発フレームワークを勉強した後、小さなDemoを作りました.主な機能は画像データを取得し、滝の流れの形で展示することです.プロジェクトの効果:
プロジェクトの効果gif
コード実装:
ネットワーク要求の対外インタフェースはHttpManagerというクラスを通じてアクセスする:
public class HttpManager {

    //base http service
    private HttpService httpService;

    //      
    private HttpManager() {
        httpService = RetrofitClient.getInstance().getHttpService(HttpService.class);
    }

    /**
     * create singleton instance
     */
    private static class SingletonHolder {
        private static final HttpManager INSTANCE = new HttpManager();
    }

    /**
     * obtain the instance
     *
     * @return
     */
    public static HttpManager getInstance() {
        return SingletonHolder.INSTANCE;
    }

    public void getImages(String query,int startIndex,int endIndex,Subscriber subscriber){
        Observable observable = httpService.getImageData(query,startIndex,endIndex);
        RetrofitClient.getInstance().toSubscribe(observable,subscriber);
    }
}

ここでhttpServiceはRetrofitのインタフェースクラスです.
public interface HttpService {

    @GET("j")
    Observable getImageData(@Query("q") String q,@Query("sn") int sn,@Query("pn") int pn);
}


Retrofitは、必要なネットワーク要求をインタフェースとして定義します.HttpManagerの構築方法:
   //      
    private HttpManager() {
        httpService = RetrofitClient.getInstance().getHttpService(HttpService.class);
    }

ここでは、カスタムHttpServiceインタフェースクラスをRetrofitに関連付け、Retrofitがどのようなリクエストメソッドを使用しているのか、どのようなパラメータを使用しているのか、結果がどのように返されているのかを示すことを目的とします.RetrofitClientでは、Retrofitの基本パラメータを設定します.
public class RetrofitClient {

    private Retrofit retrofit;

    private RetrofitClient() {
    }

    /**
     * create singleton instance
     */
    private static class SingletonHolder {
        private static final RetrofitClient INSTANCE = new RetrofitClient();
    }

    /**
     * obtain the instance
     *
     * @return
     */
    public static RetrofitClient getInstance() {
        return SingletonHolder.INSTANCE;
    }

    /**
     * get base http Service
     *
     * @param clazz
     * @param    class which need to init
     * @return return formatted instance of Class of T
     */
    public  T getHttpService(Class clazz) {
        return getHttpService(clazz, HttpConsts.BASE_URL);
    }

    public  T getHttpService(Class clazz, String baseUrl) {
        return getHttpService(clazz, baseUrl, GsonConverterFactory.create());
    }

    public  T getHttpService(Class clazz, String baseUrl, Converter.Factory factory) {
        OkHttpClient.Builder okBuilder = new OkHttpClient.Builder()
                .connectTimeout(HttpConsts.TIMEOUT, TimeUnit.MILLISECONDS);

        Retrofit.Builder builder = new Retrofit.Builder();
        builder.client(okBuilder.build());
        builder.addCallAdapterFactory(RxJavaCallAdapterFactory.create());
        builder.baseUrl(baseUrl);
        if (factory != null) {
            builder.addConverterFactory(factory);
        }
        retrofit = builder.build();

        return retrofit.create(clazz);
    }

    /**
     * config to base subscribe
     *
     * @param observable
     * @param subscriber
     * @param 
     */
    public  void toSubscribe(Observable observable, Subscriber subscriber) {
        observable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(subscriber);
    }

}

ここには2つの方法があります.一つはgetHttpServiceメソッドで、このメソッドにGsonConverterFactoryを加えてjson変換を行い、RxJavaCallAdapterFactoryを加えてRxJavaをサポートします.もう1つの方法toSubscribe方法は、ネットワーク要求の結果処理にコールバックを提供することである.実際のネットワークリクエストは次のとおりです.
 public void getImages(String query,int startIndex,int endIndex,Subscriber subscriber){
        Observable observable = httpService.getImageData(query,startIndex,endIndex);
        RetrofitClient.getInstance().toSubscribe(observable,subscriber);
    }

ここでobservableは既にRetrofitネットワークが要求した結果である.その後,結果の処理をtoSubscribe法により外部呼び出し者にコールバックする.工事住所:https://github.com/PaulZJ/WaterFallFlow