2015-05-20 16 views
1

我有一個網絡requst:我怎樣才能提取的onError rxjava的方法,通過使用lambda

userApi.getUserInfoByUid (AuthUtils.getUid (ctx), AuthUtils.getToken (ctx)) 
      .doOnNext (u -> saveToCache (u)) 
      .observeOn (AndroidSchedulers.mainThread()) 
      .subscribe (u -> { 
       if (updateListener != null) 
        updateListener.onUpdate (u); 
      },e->{ 
       Toast.makeText (ctx,"network error",Toast.LENGTH_SHORT).show(); 
      }); 

你知道,很多要求這倆網絡錯誤,所以我提取的OnError()方法。如:

abstract class Mysubscrib<T> extends Subscriber<T>{ 

    @Override 
    public void onCompleted() { 
     //do nothing 
    } 

    @Override 
    public void onError(Throwable e) { 
     Toast.makeText (ctx,"network error",Toast.LENGTH_SHORT).show(); 
    } 
} 

    userApi.getUserInfoByUid (AuthUtils.getUid (ctx), AuthUtils.getToken (ctx)) 
      .doOnNext (u -> saveToCache (u)) 
      .observeOn (AndroidSchedulers.mainThread()) 
      .subscribe (new Mysubscrib<UserInfo>() { 
       @Override 
       public void onNext(UserInfo userInfo) { 
        if (updateListener != null) 
         updateListener.onUpdate (userInfo); 
       } 
      }); 

,但如果我這樣做,我不能用的λ,它的感覺bad.how我可以使用:

userApi.getUserInfoByUid (AuthUtils.getUid (ctx), AuthUtils.getToken (ctx)) 
      .doOnNext (u -> saveToCache (u)) 
      .observeOn (AndroidSchedulers.mainThread()) 
      .subscribe (u->{ 
       if (updateListener != null) 
        updateListener.onUpdate (u); 
      }); 
+0

可以看到[在GitHub的這個示例](HTTPS:/ /github.com/CabezasGonzalezJavier/HelloRxJavaRetrolambda)和[本博客](http://thedeveloperworldisyours.com/android/rxjava-retrolambda/#sthash.z5AT4BS4.dpbs)開心代碼!!! – Cabezas

回答

5

不幸的是,Java和它的lambda表達式不允許做這樣的事情。要解決它的最簡單的方法是提供一種用於Mysubscrib接受Action1作爲參數提供額外的工廠方法:

abstract class Mysubscrib<T> extends Subscriber<T> { 
    public static <T> Mysubscrib<T> create(final Action1<? super T> action) { 
     return new Mysubscrib<T>() { 
      @Override 
      public onNext(final T value) { 
       action.call(value); 
      } 
     } 
    } 

    @Override 
    public void onCompleted() { 
     //do nothing 
    } 

    @Override 
    public void onError(Throwable e) { 
     Toast.makeText (ctx,"network error",Toast.LENGTH_SHORT).show(); 
    } 
} 

用法:

userApi.getUserInfoByUid (AuthUtils.getUid (ctx), AuthUtils.getToken (ctx)) 
     .doOnNext (u -> saveToCache (u)) 
     .observeOn (AndroidSchedulers.mainThread()) 
     .subscribe (Mysubscrib.create(u -> { 
      if (updateListener != null) 
       updateListener.onUpdate (u); 
     }); 
+0

thx,這解決了我的困惑 – mio4kon