Retrofitパッケージ

5763 ワード

RetrofitはRxjavaパッケージの考え方を結合する:
  • は主に4つの部分に分けられる:エンティティクラス、Observable、Subscriber、Retrofit.

  • エンティティークラス
    一般にクライアントは、リンクを介してサービス側からデータを取得し、アプリケーションに注入して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();
            }
        }
    }