Rxjava,SubjectSubscriptionManager有太多的subjectObserver

时间:2016-12-15 06:50:39

标签: rx-java rx-android

我使用PublishSubject制作RXBus。 发送邮件时,请致电 subject.onNext 我使用 subject.ofType.doOnNext 进行注册。

然后我发现当我注册一个并发送消息数千次。 它变得非常慢。我添加了一些日志,我知道SubjectObserver太多了。 PublishSubject.onNext中的循环花费了大量时间。

然后我添加一个方法来清除一些用过的主题。

        public synchronized State removeFinishObserver(){
            SubjectObserver[] a = observers;
            SubjectObserver[] b = new SubjectObserver[a.length + 1];
            int index = 0;
            for(SubjectObserver observer:observers){
                LogUtils.d("onNextFinish:" + observer.onNextFinish);
                if(!observer.onNextFinish){
                    b[index] = observer;
                    index ++;
                }
            }
            SubjectObserver[] c = new SubjectObserver[index];
            return new State(terminated, c);
    }

但它不能很好地工作,甚至更慢。我没有想法快速制作它。所以我怀疑任何人都可以帮助我。

======================更多====================== / p>

void sendNext();//after several millseconds, receive will happened,maybe timeout
void receive(){
    RxBus.getDefault().post(tmp);
}
RxBus.getDefault().toObservable(String.class)
            .doOnNext(s -> {
                    sendNext();
                }
            })
            .timeout(5, TimeUnit.SECONDS)
            .doOnError(throwable -> {
                if(throwable instanceof TimeoutException){
                    sendNext();
                }
            })
            .retry();
public class RxBus {
    private static volatile RxBus defaultInstance;

    private final Subject<Object, Object> bus;
    public RxBus() {
        bus = new SerializedSubject<>(PublishSubject.create());
    }

    public static RxBus getDefault() {
        if (defaultInstance == null) {
            synchronized (RxBus.class) {
                if (defaultInstance == null) {
                    defaultInstance = new RxBus();
                }
            }
        }
        return defaultInstance ;
    }
    public void post (Object o) {
        bus.onNext(o);
    }
    public <T> Observable<T> toObservable (Class<T> eventType) {
        return bus.ofType(eventType);
    }
}

compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.2.3'

0 个答案:

没有答案