【发布时间】:2017-03-29 06:54:41
【问题描述】:
我想创建一个可按需发出项目的 Observable,这意味着我想要一次订阅 Observable 并根据我的请求通知 Observable 我需要新项目。
这是我使用 PublishSubject 所做的:
public class RecognizeSubject {
PublishSubject<Bitmap> mSubject;
private Context mContext;
private FaceDetector mFaceDetecor;
public RecognizeSubject(Context mContext) {
this.mContext = mContext;
this.mSubject = PublishSubject.create();
}
public void detect(Bitmap btm){
mSubject.onNext(btm);
}
public Flowable<SinglePhotoId> execute() {
return mSubject.toFlowable(BackpressureStrategy.DROP)
.observeOn(Schedulers.newThread())
.map(bitmap1 -> recognize(bitmap1))
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe(disposable -> initialize())
.doFinally(() -> release());
}
private void initialize() {
mFaceDetecor = new FaceDetector.Builder(mContext)
.setTrackingEnabled(false)
.setLandmarkType(FaceDetector.ALL_LANDMARKS)
.build();
}
private void release() {
if (mFaceDetecor != null)
mFaceDetecor.release();
}
private SinglePhotoId recognize(Bitmap bitmap) {
//SystemClock.sleep(3000);
//make hard background work and return SinglePhotoId object
}
}
这是 Activity 类中的一个用法:
private void takeSubjectSnap() {
if (mSubject == null)
mSubject = new RecognizeSubject(getBaseContext());
if (mDisposable == null || mDisposable.isDisposed()) {
mDisposable = mSubject.execute()
.subscribe(this::handleDetectionSuccess,
this::handleDetectionError,
this::handleDetectionCompleted);
}
mSnapshotButton.setProgress(true);
mSubject.detect(myVideoView.getBitmap());
}
所以基本上我订阅了 Flowable 对象并将 Bitmap 对象传递给我的 Subject 类以继续并通过 Flowable 返回结果,该解决方案是正确的还是会产生一些内存泄漏?
有没有更好的解决方案可以通过标准的 onNext() 方法将对象发送到 Observable 以继续并返回结果?
【问题讨论】:
标签: java android rx-java observable rx-android