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