gpt4 book ai didi

android - RXJava 将一个值传递给 onComplete

转载 作者:行者123 更新时间:2023-11-29 15:39:32 25 4
gpt4 key购买 nike

我正在使用 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. 有没有一种方法可以在一个事件中或用更少的代码创建可观察对象并订阅它?

最佳答案

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

  2. 您可以简单地使用匿名方法连续编写所有代码,如果您将使用 lambda,它将减少更多样板代码。

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

无论如何,您不必在 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
});

关于android - RXJava 将一个值传递给 onComplete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43275366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com