Java – How do I create a custom subscriber?

How do I create a custom subscriber?… here is a solution to the problem.

How do I create a custom subscriber?

I want to

show progressDialog when observable is downloading a file, and I want to send the file to subscribers when done.

For example, I tried to create my custom subscriber through an extension of Subscriber:

public abstract class MySubscriber<T> extends Subscriber {
    abstract void onMessage(String message);
    abstract void onDownloaded(File file);
}

And try subscribing to it:
`

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

What is observable is:

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

The answer is “the subscriber is not an instance of MySubscriber”

Solution

The reason subscriber is not of the MySubscriber type is because the instance you pass ends up wrapped in subscribe(). in SafeSubscriber. :

<pre class=”lang-java prettyprint-override”>private static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable) {
...
if(!( subscriber instanceof SafeSubscriber)) {
subscriber = new SafeSubscriber((Subscriber)subscriber);
}
...
}
}

If you want to continue using your method, you can convert subscriber to SafeSubscriber and call SafeSubscriber#getActual() to get your MySubscriber instance.

In your case:

<pre class=”lang-java prettyprint-override”>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);
}
});

Related Problems and Solutions