使用RxJava 2对多个订户和数据流的策略

时间:2017-11-05 15:48:24

标签: java android performance rx-java rx-java2

我无法决定如何使用RxJava2正确实现此任务。

问题是如下。我正在使用AuidoRecord录制音频。

目前我已经实现了类似

的自定义Flowable
private class StreamAudioRecordRunnable extends Flowable<short[]> implements Runnable {
    private int mShortBufferSize;
    private List<Subscriber<? super short[]>> mSubscribers = new ArrayList<>();
    private short[] mAudioShortBuffer;

    private void removeAllNullableSubscribers() {
        mSubscribers.removeAll(Collections.singleton(null));
    }

    private void notifyAllSubscribers(short[] audioBuffer) {
        removeAllNullableSubscribers();
        for (Subscriber<? super short[]> subscriber : mSubscribers) {
            subscriber.onNext(audioBuffer);
        }
    }

    @Override
    protected void subscribeActual(Subscriber<? super short[]> newSubscriber) {
        mSubscribers.add(newSubscriber);
    }

    private void notifyAllSubscribersAboutError(Throwable error) {
        for (Subscriber<? super short[]> subscriber : mSubscribers) {
            subscriber.onError(error);
        }
    }

    @Override
    public void run() {
            // Init stuff
            while (mIsRecording.get()) {
                int ret;
                ret = mAudioRecord.read(mAudioShortBuffer, 0, mShortBufferSize);                              
                notifyAllSubscribers(mAudioShortBuffer);
             }
        mAudioRecord.release();
    }
}

如您所见,我手动将订阅者添加到列表中。然后,当我获得新缓冲区时,所有订户都会收到通

我猜这不是最有效的方法。

我需要什么

  1. 至于这种可流动的服务运行。它应该运行直到服务处于活动状态,即使没有订阅者。
  2. 订阅者不是常量,他们可以订阅然后取消订阅,但Flowable / Observable应该仍在运行。
  3. 由于Flowable发出的数据是流,因此不应通知订阅者已经发出的项目,他们应该只获取当前的流数据。火与忘。
  4. 即使所有订阅者都已消失,Flowable仍应运行。
  5. 请建议实施此政策的正确策略。 我将不胜感激任何帮助。

1 个答案:

答案 0 :(得分:0)

这样的东西
public class StreamAudioRecordRunnable  {
    private int mShortBufferSize;
    private short[] mAudioShortBuffer;
    private ConnectedFlowable<short[]> audioFlowable();

    public StreamAudioRecordRunnable() {
        audioFlowable = Flowable.create(new ObservableOnSubscribe<short[]>() {
            @Override
            public void subscribe(FlowableEmitter<short[]> emitter) throws Exception {
                try {
                    while (mIsRecording.get()) {
                        int ret;
                        ret = mAudioRecord.read(mAudioShortBuffer, 0, mShortBufferSize);                              
                        emitter.onNext(mAudioShortBuffer);
                    }
                    emitter.onComplete();
                    mAudioRecord.release();
                } catch (Exception e) {
                    emitter.onError(e);
                    mAudioRecord.release();
                }
            }
        }).subscribeOn(Schedulers.io()).publish();  
    }


    public Flowable<short[]> getFlowable() {
            return audioFlowable.hide();
    }

    @Override
    public void start() {
        audioObservable.connect();      
    }
}

将是我的偏好。