首页 > 解决方案 > android中rxJava 2中动态订阅的正确方法是什么?

问题描述

在android中动态订阅rxJava2中的观察者的适当方法是什么。虽然我得到了所需的输出,但我不确定这是否是在内存方面实现的正确方法。以下是我的代码

flowableObservable = getHumanflowable();

    subscriber = getFlowableObserver();
    flowableObservable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(subscriber);

//////////////////// 可观察代码

 private Flowable<String> getHumanflowable() {
        return new Flowable<String>() {
            @Override
            protected void subscribeActual(final Subscriber<? super String> s) {
                t = new Timer();

                t.scheduleAtFixedRate(
                        new TimerTask() {
                            public void run() {
                                if (listObj.size() > 0) {

                                    varToBeAddedInObservable = listObj.remove(listObj.size() - 1);
                                    // Log.d("&&&&&&&&&&",""+varToBeAddedInObservable);
                                    s.onNext(varToBeAddedInObservable);


                                } else {
                                    s.onComplete();
                                    t.cancel();
                                }

                            }
                        },
                        0,      
                        1000);
            }


        };
    }

//////////////////////// 观察者

 private Subscriber<String> getFlowableObserver() {
    /*return new Subscriber<Integer>() {
        @Override
        public void onSubscribe(Disposable d) {
            Log.d(TAG, "onSubscribe");
           // disposable = d;
        }

        @Override
        public void onSuccess(Integer integer) {
            Log.d(TAG, "onSuccess: " + integer);
        }

        @Override
        public void onError(Throwable e) {
            Log.e(TAG, "onError: " + e.getMessage());
        }
    };*/
    return new Subscriber<String>() {
        @Override
        public void onSubscribe(Subscription s) {
            mSubscriptionObject =s;
            s.request(Long.MAX_VALUE);
        }

        @Override
        public void onNext(String integer) {
            Log.d("+++++++++", "" + integer);
            int colorIndex = random.nextInt(arrayColors.length);
            //Color color = (arrayColors[colorIndex]);
            textView.setTextColor(arrayColors[colorIndex]);
            textView.setText(varToBeAddedInObservable);
            AlphaAnimation fadeIn = new AlphaAnimation(0.0f, 1.0f);
            AlphaAnimation fadeOut = new AlphaAnimation( 1.0f , 0.0f ) ;
            textView.startAnimation(fadeIn);
            // textView.startAnimation(fadeOut);
            fadeIn.setDuration(1500);
            fadeIn.setFillAfter(true);
         //   fadeOut.setDuration(1200);
            fadeOut.setFillAfter(true);
         //   fadeOut.setStartOffset(1200 - fadeIn.getStartOffset());
            fadeIn.setAnimationListener(new Animation.AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {

                }

                @Override
                public void onAnimationEnd(Animation animation) {
                    textView.setTextColor(Color.BLACK);
                    textView.setText("Jadu cha Khel Sampla !!!!");
                    textView.setTextSize(25);
                    textView.setGravity(View.TEXT_ALIGNMENT_CENTER);

                }

                @Override
                public void onAnimationRepeat(Animation animation) {

                }
            });
        }

        @Override
        public void onError(Throwable t) {

        }

        @Override
        public void onComplete() {
            createList();
           /* Flowable<String> flowableObservable = getHumanflowable();

            Subscriber<String> subscriber = getFlowableObserver();*/
            //SingleObserver<Integer> observer = getFlowableObserver();
            // flowableObservable.publish(AndroidSchedulers.mainThread());
          /*  flowableObservable.subscribeOn(Schedulers.io())
                    // .onBackpressureLatest()
                    *//* .reduce(500, new BiFunction<Integer, Integer, Integer>() {
                         @Override
                         public Integer apply(Integer result, Integer number) {
                             Log.e(TAG, "Result: " + result + ", new number: " + number);
                             return result + number;
                         }
                     })
                     .*//*.observeOn(AndroidSchedulers.mainThread()).subscribe(subscriber);*/
           /* if(mSubscriptionObject!=null) {
                mSubscriptionObject.request(Long.MAX_VALUE);
            }*/
        }
    };
}

如您所见,我在观察者的 onComplete() 方法中再次订阅它。所以它正在订阅它。对于 api 调用,考虑相同。每次我们在 api 调用成功中收到响应时,我是否可以继续订阅同一个订阅者对象,就像我在 onComplete 中所做的那样?或者有更好的方法吗?

标签: androidrx-java2

解决方案


推荐阅读