RxAndroidコンビネーションRetrofitによるファイルアップロードpost getの実現


RxAndroidコンビネーションRetrofitによるファイルアップロードpost getの実現

    , !RxAndroid Retrofit Android , ,
    RxAndroid Retrofit , ?
  • ******第1回のブログのレイアウトは少し乱れています私の后期は処理していますありがとう*********
  • 1.RxJava優勢1.RxJavaはAndroid開発者の新しい寵愛として長い間使われてきましたが、RxJavaを使ったことがある人は、これが簡単で使いやすいと思っています.使ったことのない仲間が初めてRxJavaのコードを見たとき、これは非常に煩雑だと思っていたかもしれません.総じて、RxJavaの強みは「非同期」処理が以前のasynctask(メモリ漏れが発生する)よりも優れていることです.RxJavaのGitHubアドレス2.Android RxJavaの使用紹介は詳しくて、中には4つの投稿があります.RxJavaという4つの投稿を深く浅くするには少しのlambda文法が必要ですが、言うのもいいですね.お勧めします.
    2.Retrofitの簡単な紹介
            Retrofit Square Android ,Retrofit2 OkHttp ,OkHttp Google 。 
    

    retrofitのgithubアドレス
    3.RxAndroid+Retrofit(ネットワークアクセス+ファイルアップロード)
     
    
        compile 'io.reactivex:rxandroid:1.2.1'
        compile 'io.reactivex:rxjava:1.2.4'
        compile 'com.squareup.retrofit2:retrofit:2.1.0'
        compile 'com.alibaba:fastjson:1.1.55.android'
        compile 'com.squareup.retrofit2:converter-scalars:2.0.0-beta4'
        // 
        compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
        //retrofit2 rxjava
        compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'

    1.OkHttpClientの初期化
          OkHttp , 。
    
        private OkHttpClient getBaseOKhttpClient() {
            OkHttpClient.Builder builder = new OkHttpClient().newBuilder()
                    .connectTimeout(20, TimeUnit.SECONDS)// 
                    .readTimeout(2000, TimeUnit.MILLISECONDS)// 
                    .writeTimeout(2000, TimeUnit.MILLISECONDS);// 
            int cacheSize = 10 * 1024 * 1024; // 10 MiB// , 
            Cache cache = new Cache(BaseApplication.getInstance().getExternalCacheDir(), cacheSize);
            builder.cache(cache);// 
            builder.retryOnConnectionFailure(true);//  。
            builder.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY));// 
            OkHttpClient mOkHttpClient = builder.build();// 
            return mOkHttpClient;

    2.Retrofitのエンティティ
        Retrofit , 
    
      private Retrofit getRetrofitInstance() {
    
            if (retrofit == null)
                // Retrofit
                builder = new Retrofit.Builder();
            retrofit = builder
                    .baseUrl(BASE_URL)// , , .
                    // retrofit rxjava       
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    // String      
                    //  , gson    compile                                   //'com.squareup.retrofit2:converter-gson:2.1.0'    
                    //addConverterFactory(GsonConverterFactory.create()) 
                    .addConverterFactory(ScalarsConverterFactory.create())
                    .client(getBaseOKhttpClient())   // okhttp 
                    .build();
            return retrofit;
        }

    3.retrofitの要求タイプ:
         ,  POST  GET  Multipart( )
    
     interface HttpService {
            //    @FieldMap parameters can only be used with form encoding. (parameter #2)
            @FormUrlEncoded
            @POST
            Observable<String> POST(@Url String url, @FieldMap Map<String, Object> parms);
    
            @GET
            Observable<String> GET(@Url String url, @QueryMap Map<String, Object> map);
    
            @Multipart
            @POST
            Observable<String> UploadMultFile(@Url String ulr, @PartMap Map<String, ProgressRequestBody> parms);
        }

    4.ネットワーク要求の実行
    /**
         *  
         *
         * @param url         
         * @param parms       
         * @param subscriber  
         */
        protected void startEnqueue(String url, Map parms, final Subscriber subscriber) {
            switch (callType) {
                case GET:
                    request = ServiceType().GET(url, parms);
                    break;
                case POST:
                    request = ServiceType().POST(url, parms);
                    break;
                case UPloadMultFile:
                    Map requestBodys = new HashMap();
                    Boolean hasFalse = false;
                    if (null != parms) {
                        int i = 0;
                        for (Map.Entry entry : parms.entrySet()) {
                            File file = new File(entry.getValue() + "");
                            if (file.exists()) {
                                //requestBodys.put("file" + i + "\"; filename=\"" + file.getName(), RequestBody.create(MediaType.parse("image/png"), file));
                                logError(Uploadlistener + "");
                                ProgressRequestBody fileBody = new ProgressRequestBody(file, Uploadlistener);
                                requestBodys.put("file" + i + "\"; filename=\"" + file.getName(), fileBody);
                                i++;
                            } else {
                                hasFalse = true;
                            }
                        }
                    }
                    if (hasFalse) logError(" , !");
                    request = ServiceType().UploadMultFile(url, requestBodys);
                    break;
            }
            // httpcallback.setRetryParms(url, request, parms, callType);
            subscriion = request.observeOn(AndroidSchedulers.mainThread())
                    .subscribeOn(Schedulers.io())
                    .subscribe(result -> {
                                // 
                                Dto dto = JSON.parseObject(result.toString(), Dto.class);
                                if (!subscriber.isUnsubscribed())
                                    subscriber.onNext(dto);
                            },
                            e -> {
                                // 
                                subscriber.onError(e);
                            },
                            () -> {
                                // 
                                subscriion.unsubscribe();// 
                                subscriber.onCompleted();
                            }
                    );
        }

    5.要求方法の簡単なパッケージ
       /**
         * post 
         *
         * @param url
         * @param parms
         * @param subscriber  
         */
        public void Post(@NonNull String url, @Nullable Map parms, @Nullable final Subscriber subscriber) {
            parms = Readey(parms, subscriber);
            callType = CallType.POST;
            startEnqueue(url, parms, subscriber);
        }

    6.基本apiのカプセル化、いくつかの基本情報の追加といくつかの共通の方法の呼び出しを便利にする
    
    abstract class BaseApi {
        //    static {
    //        System.loadLibrary("gongpan");
    //    }
        protected static final String getUrl(String actition) {
            return actition + "?";
        }
    
        protected static final Map getMap() {
            Map maps = new HashMap();
            /**
             * temp: 【app time ieme native 】
             ieme: 
             time: 【 :new Date().getTime()+""】
             */
            return maps;
        }
    //xRetrofit      Retrofit      okhttp ,  
    
    /****
     *  
     */
    public static xRetrofit init() {
        if (null == instance)
            synchronized (xRetrofit.class) {
                if (null == instance)
                    instance = new xRetrofit();
            }
        return instance;
    }
    
        protected static void post(String url, Map maps, Subscriber subscriber) {
            xRetrofit xretrofit = xRetrofit.init();//    xRetrofit     
            xretrofit.Post(url, maps, subscriber);// xRetrofit post 
        }
    
        protected static void get(String url, Map maps, Subscriber subscriber) {
            xRetrofit xretrofit = xRetrofit.init();
            xretrofit.GET(url, maps, subscriber);// xRetrofit GET 
        }
    
        protected static void UploadMultFile(String url, Map maps, ProgressRequestBody.UploadCallbacks Uploadlistener, Subscriber subscriber) {
            xRetrofit xretrofit = xRetrofit.init();
            xretrofit.UploadMultFile(url, maps, Uploadlistener, subscriber);
            // xRetrofit UploadMultFile 
        }
    }

    7.apiのclass書き方:統一的に書くので、呼び出しが便利で、コードも間接的にbaseapiを継承します:
    //     
    public class HomeApi extends BaseApi {
        public static void getTopic_list(Subscriber subscriber) {
            String url = getUrl("joke/content/list.from");
            Map maps = getMap();
            maps.put("sort", "desc");
            maps.put("pagesize", "20");
            maps.put("time", "1418816972");
            maps.put("key", "df2e47d904c41e62071247bd7399da23");
            post(url, maps, subscriber);// post 
        }
        // 
        //Uploadlistener 

    public static void FileUpload(List paths, ProgressRequestBody.UploadCallbacks Uploadlistener, Subscriber subscriber) { String url = getUrlAppend(“app/AppFileUpload”); Map
    
    }
    

    8.Subscriberを簡単にカプセル化し、返信情報を統一的に処理するのに便利(エラー処理、ネット弾窓など)
    
    public abstract class BaseSubscriber extends Subscriber<Dto> {
        @Override
        public void onCompleted() {
            logError(" ");
    
        }
    
        @Override
        public void onError(Throwable t) {
            if (t.toString().contains("SocketTimeoutException")) {
                logError(" , , ?");
                return;
            }
            if (t.toString().contains("ConnectException")) {
                logError(" , , ?");
                return;
            }
    
        }
    
        @Override
        public void onNext(Dto dto) {
        }
    
        public static void logError(Object obj) {
            Log.e("Xiang", obj.toString());
        }
    }

    9.ページイベントにおけるapiの呼び出し、ネットワーク要求の実行
    // 
    HomeApi.getTopic_list(new BaseSubscriber() {
        @Override
        public void onNext(Dto dto) {
            super.onNext(dto);
    
        }
    });

    はい、まずここまで書いて、暇な時間は絶えず改善します.何かバグがあったら、先輩の指摘を歓迎します.ありがとうございます.
    プロジェクトdemoのgithubアドレス