如何创建自定义订阅者?

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);
    }
});