Androidモバイル開発におけるRxJavaの実戦応用その2


応答プログラミングは非同期とデータストリームでトランザクション関係を構築するプログラミングモデルであり、非同期とデータストリームはトランザクション関係を構築するために存在し、非同期は関係のないトランザクションを区別するためであり、データストリームは関連するトランザクションに連絡するためである.
日文翻译:この文章はドアの心から竜のブログをくわえて、オリジナルの内容に属して、転載して出典を明記してくださいhttps://blog.csdn.net/geduo_83/article/details/89740000
文書ディレクトリ
  • 1.簡単なネットワーク要求を実現する
  • 2.キャッシュを読み出す、キャッシュにデータがない場合にネットワーク要求によりデータを取得した後、UI
  • を更新する.
  • 3.複数のネットワーク要求が
  • に順次依存する.
  • 4.複数のインタフェースを組み合わせたデータ更新UI
  • 5.間隔タスクによる心拍数
  • の実現
    1.簡単なネットワーク要求を実現する
    Observable
    .create(new ObservableOnSubscribe() {
                @Override
                public void subscribe(@NonNull ObservableEmitter e) throws Exception {
                    Builder builder = new Builder()
                            .url("http://api.avatardata.cn/MobilePlace/LookUp?key=ec47b85086be4dc8b5d941f5abd37a4e&mobileNumber=13021671512")
                            .get();
                    Request request = builder.build();
                    Call call = new OkHttpClient().newCall(request);
                    Response response = call.execute();
                    e.onNext(response);
                }
            })
    .map(new Function() {
                        @Override
                        public MobileAddress apply(@NonNull Response response) throws Exception {
    
                            Log.e(TAG, "map   :" + Thread.currentThread().getName() + "
    "); if (response.isSuccessful()) { ResponseBody body = response.body(); if (body != null) { Log.e(TAG, "map: :" + response.body()); return new Gson().fromJson(body.string(), MobileAddress.class); } } return null; } }) .observeOn(AndroidSchedulers.mainThread()) .doOnNext(new Consumer() { @Override public void accept(@NonNull MobileAddress s) throws Exception { Log.e(TAG, "doOnNext :" + Thread.currentThread().getName() + "
    "); mRxOperatorsText.append("
    doOnNext :" + Thread.currentThread().getName() + "
    "); Log.e(TAG, "doOnNext: :" + s.toString() + "
    "); mRxOperatorsText.append("doOnNext: :" + s.toString() + "
    "); } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer() { @Override public void accept(@NonNull MobileAddress data) throws Exception { Log.e(TAG, "subscribe :" + Thread.currentThread().getName() + "
    "); mRxOperatorsText.append("
    subscribe :" + Thread.currentThread().getName() + "
    "); Log.e(TAG, " :" + data.toString() + "
    "); mRxOperatorsText.append(" :" + data.toString() + "
    "); } }, new Consumer() { @Override public void accept(@NonNull Throwable throwable) throws Exception { Log.e(TAG, "subscribe :" + Thread.currentThread().getName() + "
    "); mRxOperatorsText.append("
    subscribe :" + Thread.currentThread().getName() + "
    "); Log.e(TAG, " :" + throwable.getMessage() + "
    "); mRxOperatorsText.append(" :" + throwable.getMessage() + "
    "); } });

    2.キャッシュを読み込み、キャッシュにデータがない場合はネットワーク要求でデータを取得してUIを更新する
    Observable cache = Observable
    .create(new ObservableOnSubscribe() {
                @Override
                public void subscribe(@NonNull ObservableEmitter e) throws Exception {
                    Log.e(TAG, "create    :"+Thread.currentThread().getName() );
                    FoodList data = CacheManager.getInstance().getFoodListData();
    
                    //      concat  ,     onComplete           Observable
                    if (data != null){ //          ,         ,        
                        isFromNet = false;
                        Log.e(TAG, "
    subscribe: :" ); runOnUiThread(new Runnable() { @Override public void run() { mRxOperatorsText.append("
    subscribe: :
    "); } }); e.onNext(data); }else { isFromNet = true; runOnUiThread(new Runnable() { @Override public void run() { mRxOperatorsText.append("
    subscribe: :
    "); } }); Log.e(TAG, "
    subscribe: :" ); e.onComplete(); } } }); Observable network = Rx2AndroidNetworking.get("http://www.tngou.net/api/food/list") .addQueryParameter("rows",10+"") .build() .getObjectObservable(FoodList.class); // Observable Observable .concat(cache,network) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer() { @Override public void accept(@NonNull FoodList tngouBeen) throws Exception { Log.e(TAG, "subscribe :"+Thread.currentThread().getName() ); if (isFromNet){ mRxOperatorsText.append("accept : :
    "); Log.e(TAG, "accept : :
    "+tngouBeen.toString() ); CacheManager.getInstance().setFoodListData(tngouBeen); } mRxOperatorsText.append("accept: :" + tngouBeen.toString()+"
    "); Log.e(TAG, "accept: :" + tngouBeen.toString()); } }, new Consumer() { @Override public void accept(@NonNull Throwable throwable) throws Exception { Log.e(TAG, "subscribe :"+Thread.currentThread().getName() ); Log.e(TAG, "accept: :"+throwable.getMessage() ); mRxOperatorsText.append("accept: :"+throwable.getMessage()+"
    "); } });

    3.複数のネットワーク要求が順次依存する
    Rx2AndroidNetworking.get("http://www.tngou.net/api/food/list")
                    .addQueryParameter("rows", 1 + "")
                    .build()
                    .getObjectObservable(FoodList.class) //            ,    FootList
                    .subscribeOn(Schedulers.io())        //  io        
                    .observeOn(AndroidSchedulers.mainThread()) //                  
                    .doOnNext(new Consumer() {
                        @Override
                        public void accept(@NonNull FoodList foodList) throws Exception {
                            //                    
                            Log.e(TAG, "accept: doOnNext :" + foodList.toString());
                            mRxOperatorsText.append("accept: doOnNext :" + foodList.toString()+"
    "); } }) .observeOn(Schedulers.io()) // io .flatMap(new Function>() { @Override public ObservableSource apply(@NonNull FoodList foodList) throws Exception { if (foodList != null && foodList.getTngou() != null && foodList.getTngou().size() > 0) { return Rx2AndroidNetworking.post("http://www.tngou.net/api/food/show") .addBodyParameter("id", foodList.getTngou().get(0).getId() + "") .build() .getObjectObservable(FoodDetail.class); } return null; } }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer() { @Override public void accept(@NonNull FoodDetail foodDetail) throws Exception { Log.e(TAG, "accept: success :" + foodDetail.toString()); mRxOperatorsText.append("accept: success :" + foodDetail.toString()+"
    "); } }, new Consumer() { @Override public void accept(@NonNull Throwable throwable) throws Exception { Log.e(TAG, "accept: error :" + throwable.getMessage()); mRxOperatorsText.append("accept: error :" + throwable.getMessage()+"
    "); } });

    4.複数のインタフェースを組み合わせたデータ更新UI
    Observable observable1 = Rx2AndroidNetworking.get("http://api.avatardata.cn/MobilePlace/LookUp?key=ec47b85086be4dc8b5d941f5abd37a4e&mobileNumber=13021671512")
                    .build()
                    .getObjectObservable(MobileAddress.class);
    
            Observable observable2 = Network.getGankApi()
                    .getCategoryData("Android",1,1);
    
            Observable.zip(observable1, observable2, new BiFunction() {
                @Override
                public String apply(@NonNull MobileAddress mobileAddress, @NonNull CategoryResult categoryResult) throws Exception {
                    return "       :     :"+mobileAddress.getResult().getMobilearea()+"  :"+categoryResult.results.get(0).who;
                }
            }).subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Consumer() {
                        @Override
                        public void accept(@NonNull String s) throws Exception {
                            Log.e(TAG, "accept:   :" + s+"
    "); } }, new Consumer() { @Override public void accept(@NonNull Throwable throwable) throws Exception { Log.e(TAG, "accept: :" + throwable+"
    "); } });

    5.間隔タスクによる心拍数の実現
    private Disposable mDisposable;
        @Override
        protected void doSomething() {
            mDisposable = Flowable.interval(1, TimeUnit.SECONDS)
                    .doOnNext(new Consumer() {
                        @Override
                        public void accept(@NonNull Long aLong) throws Exception {
                            Log.e(TAG, "accept: doOnNext : "+aLong );
                        }
                    })
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Consumer() {
                        @Override
                        public void accept(@NonNull Long aLong) throws Exception {
                            Log.e(TAG, "accept:      :"+aLong );
                            mRxOperatorsText.append("accept:      :"+aLong +"
    "); } }); } /** * */ @Override protected void onDestroy() { super.onDestroy(); if (mDisposable != null){ mDisposable.dispose(); } }