Retrofitパッケージ
5763 ワード
RetrofitはRxjavaパッケージの考え方を結合する:は主に4つの部分に分けられる:エンティティクラス、Observable、Subscriber、Retrofit.
エンティティークラス
一般にクライアントは、リンクを介してサービス側からデータを取得し、アプリケーションに注入してUIを更新する.返されるデータは通常JSONです.
一般的な構造はこのようにして、私たち個人にとって役に立つのはtems部分だけで、後期の需要が変化するとitemsのjsonデータ構造が変化し、対応するクラス構造が変化するので、汎用型でitemsクラスの多変の問題を解決します.itemsで使用するクラスを個別にカプセル化します.
Retrofit
このようなより多くのパッケージの場合、Retrofitの構成および要求プロセスについては、サービスインタフェースには関与しません.単一のモードでカプセル化します.
Observable
Observableのこの部分は、Retrofitをカプセル化したサービスインタフェースパラメータ伝達、すなわちイベントの処理がより多い.この部分が変化しているため、Retrofit単例でパッケージすることは不可能である.
Subscriber
Subscriberを継承する抽象クラスを作成し、OnNext()を抽象メソッドとして定義します.OnNext()メソッドでは、UIにデータをより多く渡すために使用されます.
エンティティークラス
一般にクライアントは、リンクを介してサービス側からデータを取得し、アプリケーションに注入してUIを更新する.返されるデータは通常JSONです.
{
items: [],
has_more: true,
quota_max: 300,
quota_remaining: 299
}
一般的な構造はこのようにして、私たち個人にとって役に立つのはtems部分だけで、後期の需要が変化するとitemsのjsonデータ構造が変化し、対応するクラス構造が変化するので、汎用型でitemsクラスの多変の問題を解決します.itemsで使用するクラスを個別にカプセル化します.
public class StackUserEntity {
/**
* items : [{"reputation":904115,"creation_date":1222430705,"user_type":"registered","user_id":22656,"accept_rate":86,"location":"Reading, United Kingdom","website_url":"http://csharpindepth.com","link":"http://stackoverflow.com/users/22656/jon-skeet","profile_image":"https://www.gravatar.com/avatar/6d8ebb117e8d83d74ea95fbdd0f87e13?s=128&d=identicon&r=PG","display_name":"Jon Skeet"}]
* has_more : true
* quota_max : 300
* quota_remaining : 299
*/
private boolean has_more;
private int quota_max;
private int quota_remaining;
private T items;
}
Observable>>
Retrofit
このようなより多くのパッケージの場合、Retrofitの構成および要求プロセスについては、サービスインタフェースには関与しません.単一のモードでカプセル化します.
public class HttpMethodes{
public static final String baseUrl = "https://api.douban.com/v2/movie/";
private static final int DEFAULT_TIMEOUT = 5;
private Retrofit retrofit;
private static HttpMethodes httpMethodes;
//
private HttpMethodes() {
OkHttpClient.Builder builder =new OkHttpClient.Builder();
builder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(builder.build())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
}
// , , ( )
public static HttpMethodes getInstance() {
if (httpMethodes == null) {
synchronized (HttpMethodes.class) {
if (httpMethodes == null) {
httpMethodes = new HttpMethodes();
}
}
}
return httpMethodes;
}
// , 。
public void getMovie(Subscriber subscriber,Observable observable) {
toSubscriber(observable,subscriber);
}
// , url 。 。
public T toService(final Class from) {
return retrofit.create(from);
}
private void toSubscriber(Observable o , Subscriber s) {
o.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(s);
}
}
Observable
Observableのこの部分は、Retrofitをカプセル化したサービスインタフェースパラメータ伝達、すなわちイベントの処理がより多い.この部分が変化しているため、Retrofit単例でパッケージすることは不可能である.
private Observable> getSource() {
return methodes.toService(StackExchangeService.class)
.getSource(10) // map StackUserEntity List;
.map(new Func1>, List>() {
@Override
public List call(StackUserEntity> listStackUserEntity) {
return listStackUserEntity.getItems();
}
});
}
Subscriber
Subscriberを継承する抽象クラスを作成し、OnNext()を抽象メソッドとして定義します.OnNext()メソッドでは、UIにデータをより多く渡すために使用されます.
public abstract class ProgressSubscriber extends Subscriber {
private SubscriberOnNextListener mSubscriber;
@Inject
public Context context;
private ProgressDialog dialog;
public void setmSubscriber(SubscriberOnNextListener mSubscriber) {
this.mSubscriber = mSubscriber;
}
public void setContext(Context context) {
this.context = context;
}
@Override
public void onStart() {
showProgressDialog();
super.onStart();
}
@Override
public void onCompleted() {
destroyProgress();
Toast.makeText(context, " ", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Throwable e) {
destroyProgress();
Toast.makeText(context, " , ", Toast.LENGTH_SHORT).show();
}
//
@Override
abstract public void onNext(T t);
private void destroyProgress() {
if (dialog!=null) {
dialog.dismiss();
}
dialog = null;
}
private void showProgressDialog() {
if (dialog == null) {
dialog = new ProgressDialog(context);
dialog.setCancelable(true);
dialog.setMessage(" , !");
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
if (! isUnsubscribed()) {
unsubscribe(); // , Observable ( url 。)
}
}
});
}
if (! dialog.isShowing()) {
dialog.show();
}
}
}