RXJava将值传递给onComplete

时间:2017-04-07 10:07:00

标签: android rx-java rx-java2

我正在使用RXJava 2.在subscribe方法中的一些逻辑后,我想删除一个用过的文件。我想我应该在onComplete中这样做。但我无法通过我的File对象。 我的代码: 问题:

Observer<Bitmap> observer = new Observer<Bitmap>() {
    @Override
    public void onSubscribe(Disposable d) {
    }

    @Override
    public void onNext(Bitmap bitmap) {
        if(mImageView.getTag().toString().equals(TAG)) {
            mImageView.setImageBitmap(bitmap);
        }
    }

    @Override
    public void onError(Throwable e) {
    }

    @Override
    public void onComplete() {
        //            outputFile.delete();
    }
};

Observable<Bitmap> observable = Observable.create(new ObservableOnSubscribe<Bitmap>() {
    @Override
    public void subscribe(ObservableEmitter<Bitmap> e) throws Exception {
        File outputFile = new File(newTAG);
        // do some stuff with a file
        Bitmap bitmap = decodeSampledBitmapFromUrl(newTAG, width, height);
        e.onNext(bitmap);
        // now I need to delete a file
        e.onComplete();
        }
    }
);
observable.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).subscribe(observer);
  1. 如何将outputFile传递给onComplete
  2. 有没有办法在一个事件或少量代码中创建observable和subscride?

2 个答案:

答案 0 :(得分:3)

  1. 您无法将对象传递给onComplete(),因为onComplete()没有值,这是流结束的信号,并且不会再发出任何项目。
    你可以在onNext()传递每次发射(即用@akarnokd建议的元组包裹2个对象)并在那里删除它。

  2. 您可以使用匿名方法连续编写所有代码,如果您使用lambdas,它将删除更多的样板代码。

  3. 如果您要删除onCompleted处的文件,它将确实将在主线程上执行,正如您observerOn()指定的那样。

  4. 无论如何,您不必在onCompleted()事件上执行此操作,只需在将位图提取到内存后将其删除在订阅代码(创建方法)上,订阅者不应该知道或关心Bitmap如何提取。此外,您可以使用fromCallable(),意味着使用执行所有操作的方法将其包装起来。总结一下:

     Observable.fromCallable(() -> {
            File outputFile = new File(newTAG);
            // do some stuff with a file
            Bitmap bitmap = decodeSampledBitmapFromUrl(newTAG, width, height);
            // be sure to handle properly exceptions for ensure file will be closed
            outputFile.delete();
            return bitmap;
        })
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(bitmap -> {
                            if (mImageView.getTag().toString().equals(TAG)) {
                                mImageView.setImageBitmap(bitmap);
                            }
                        },
                        throwable -> {
                            //handle error
                        });
    

答案 1 :(得分:1)

您可以在onComplete()或onNext()中使用interface而不是执行操作。

创建界面

public interface OnActionComplete {
    void onComplete();
}

在您的活动或片段中实施

public class YourActivity extends BaseActivity implements OnActionComplete {
    @Override
    public void onComplete() {
        //perform your action
    }
}

现在只需在完成任务时调用该方法,如onNext。

@Override
public void onNext(Bitmap bitmap) {
    if(mImageView.getTag().toString().equals(TAG)) {
        mImageView.setImageBitmap(bitmap);

        activityInstance.onComplete(); // this will trigger onComplete() method of interface.
    }
}