我想在 observable
正在下载文件时显示 progressDialog
,完成后想将文件发送给订阅者。
例如,我尝试通过 Subscriber
的扩展来创建我的自定义订阅者:
public abstract class MySubscriber<T> extends Subscriber {
abstract void onMessage(String message);
abstract void onDownloaded(File file);
}
并尝试订阅它: `
MySubscriber mySubscriber = new MySubscriber() {
@Override
public void onMessage(String message) {
progessDialog.setMessage(message);
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Object o) {
}
};
observable.subscribe(mySubscriber);
可观察到的是:
observable = Observable.create(new Observable.OnSubscribe<Void>() {
@Override
public void call(Subscriber<Void> subscriber) {
//file downloading code...
if (subscriber instanceof MySubscriber){
((MySubscriber) subscriber).onMessage("100%");
((MySubscriber) subscriber).onDownloaded(file);
}else{
Log.e(TAG,"subscriber is not instance of MySubscriber")
}
}
答案是“订阅者不是 MySubscriber 的实例”
最佳答案
subscriber
不是MySubscriber
类型的原因是因为您传递的实例最终被subscribe()
包裹在SafeSubscriber
中。 :
private static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable) {
...
if(!(subscriber instanceof SafeSubscriber)) {
subscriber = new SafeSubscriber((Subscriber)subscriber);
}
...
}
}
如果你想继续使用你的方法,你可以将 subscriber
转换为 SafeSubscriber
并调用 SafeSubscriber#getActual()
来获取您的 MySubscriber
实例。
在你的情况下:
Observable.create(new Observable.OnSubscribe<Void>() {
@Override
public void call(Subscriber<? super Void> subscriber) {
Subscriber yourSubscriber = ((SafeSubscriber) subscriber).getActual();
((MySubscriber) yourSubscriber).onMessage("100%");
((MySubscriber) yourSubscriber).onDownloaded(file);
}
});
关于java - 如何创建自定义订阅者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34826392/