java - 如何创建自定义订阅者?

标签 java android rx-java rx-android

我想在 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/

相关文章:

java - 将 io.projectreactor 版本从 2.0.x 升级到 3.0.4 - 使用 Spring 框架

java - KML的字符串需要转换为java对象

java - 如何防止在tomcat启动时初始化的类对数据库进行双重写入?

android - Android 上的 ORMLite 不调用 onCreate

android导航栏隐藏和可用屏幕重叠百分比

java - RxJava插入并返回Id方法(房间)调试

java - Swing:确定拖动结束时包含的对象

java - Android 搜索 View 忽略 searchHintIcon - searchHintIcon 模糊

android - 在Android Project中导入Gradle但未建立一些jar依赖项

rx-java - 显式类型参数 Kotlin 和 RxJava