如何创建自定义订阅者?
How to create custom Subscriber?
我想在 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")
}
}
答案是"subscriber is not instance of 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);
}
});
我想在 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")
}
}
答案是"subscriber is not instance of 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);
}
});