我正在使用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);
outputFile
传递给onComplete
?答案 0 :(得分:3)
您无法将对象传递给onComplete()
,因为onComplete()
没有值,这是流结束的信号,并且不会再发出任何项目。
你可以在onNext()
传递每次发射(即用@akarnokd建议的元组包裹2个对象)并在那里删除它。
您可以使用匿名方法连续编写所有代码,如果您使用lambdas,它将删除更多的样板代码。
如果您要删除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
});
答案 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.
}
}