如何使用 lambda 提取 rxjava 的 onError 方法
How can I extract onError method of rxjava by using 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);
}
});
但是如果我这样做,我就不能使用 lambda,感觉 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);
});
不幸的是,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);
});
我有一个网络请求:
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);
}
});
但是如果我这样做,我就不能使用 lambda,感觉 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);
});
不幸的是,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);
});