mio*_*kon 1 lambda android rx-java
我有网络要求:
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 ();
});
Run Code Online (Sandbox Code Playgroud)
你知道,许多请求可能有网络错误,所以我提取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);
}
});
Run Code Online (Sandbox Code Playgroud)
但如果我这样做,我不能使用lambda,感觉很糟.我可以使用:
userApi.getUserInfoByUid (AuthUtils.getUid (ctx), AuthUtils.getToken (ctx))
.doOnNext (u -> saveToCache (u))
.observeOn (AndroidSchedulers.mainThread ())
.subscribe (u->{
if (updateListener != null)
updateListener.onUpdate (u);
});
Run Code Online (Sandbox Code Playgroud)
不幸的是,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 ();
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
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);
});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1656 次 |
最近记录: |