RxJava+Retrofitの滝の流れDemo
4282 ワード
前言
RxJava+Retrofitの開発フレームワークを勉強した後、小さなDemoを作りました.主な機能は画像データを取得し、滝の流れの形で展示することです.プロジェクトの効果:
プロジェクトの効果gif
コード実装:
ネットワーク要求の対外インタフェースはHttpManagerというクラスを通じてアクセスする:
ここでhttpServiceはRetrofitのインタフェースクラスです.
Retrofitは、必要なネットワーク要求をインタフェースとして定義します.HttpManagerの構築方法:
ここでは、カスタムHttpServiceインタフェースクラスをRetrofitに関連付け、Retrofitがどのようなリクエストメソッドを使用しているのか、どのようなパラメータを使用しているのか、結果がどのように返されているのかを示すことを目的とします.RetrofitClientでは、Retrofitの基本パラメータを設定します.
ここには2つの方法があります.一つはgetHttpServiceメソッドで、このメソッドにGsonConverterFactoryを加えてjson変換を行い、RxJavaCallAdapterFactoryを加えてRxJavaをサポートします.もう1つの方法toSubscribe方法は、ネットワーク要求の結果処理にコールバックを提供することである.実際のネットワークリクエストは次のとおりです.
ここでobservableは既にRetrofitネットワークが要求した結果である.その後,結果の処理をtoSubscribe法により外部呼び出し者にコールバックする.工事住所:https://github.com/PaulZJ/WaterFallFlow
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