2016-01-16 168 views
3

我想顯示progressDialog,而observable正在下載文件,並且當它完成後要發送文件給訂閱者。如何創建自定義訂閱者?

我試圖讓我的自定義用戶從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的實例」

回答

3

原因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); 
     } 
    ... 
    } 
} 

如果你想繼續使用你的方法,你可以投subscriberSafeSubscriber並調用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); 
    } 
}); 
+0

你可以添加一個例子嗎?我不完全瞭解如何使用它.. – NickUnuchek

+0

@NickUnuchek添加 – AndroidEx

+0

我使用的是下面的版本, 編譯 'io.reactivex:rxandroid:1.2.1' 編譯 'io.reactivex:rxjava:1.1.6' 我獲取ClassCastException OperationSubscriber不能投射到LoginSubscriber。 public static abstract class LoginSubscriber extends Subscriber abstract void onUserNameInvalid(String message); } 以上解決方案對我無效。 這個@AndroidEx的任何解決方案 我想用我的自定義方法實現以下內容:https://github.com/music60/RxAndroid-MVP-Simple/tree/master/app/src/main/java/com/studyjun/rxandroidmvpsimple –