1、首先看下面一段代码
HttpClient.getInstance().service.requestHomeBaner()
.subscribeOn(Schedulers.newThread())
.map(new HttpClient.HttpResultFunc<>())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::initData, Throwable::printStackTrace);
.subscribeOn(Schedulers.newThread())
.map(new HttpClient.HttpResultFunc<>())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::initData, Throwable::printStackTrace);
public static class HttpResultFunc<T> implements Function<HttpResult<T>, T> {
@Override
public T apply(@NonNull HttpResult<T> tHttpResult) throws Exception {
if (tHttpResult.getStatus() != NetWorkState.SUCCEES) {
ToastUtils.showShort(tHttpResult.getMessage());
throw new ApiException();
}
return tHttpResult.getResult();
}
}
@Override
public T apply(@NonNull HttpResult<T> tHttpResult) throws Exception {
if (tHttpResult.getStatus() != NetWorkState.SUCCEES) {
ToastUtils.showShort(tHttpResult.getMessage());
throw new ApiException();
}
return tHttpResult.getResult();
}
}
利用map对数据进行筛选,当返回结果不为1的时候Toast,但是上面的代码不会执行Toast,并且之后的所有Toast都不会提示
原因是,map放在subscribeOn之后,observeOn之前,这个时候map处于子线程中,Toast只有在UI线程中调用才会显示。
这个时候改成下面,Toast就可以正常显示了
HttpClient.getInstance().service.requestHomeBaner()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.map(new HttpClient.HttpResultFunc<>())
.subscribe(this::initData, Throwable::printStackTrace);
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.map(new HttpClient.HttpResultFunc<>())
.subscribe(this::initData, Throwable::printStackTrace);
2、另还有一种办法,从Toast方法着手,利用Handler
public static class HttpResultFunc<
T>
implements Function<HttpResult<
T>
,
T> {
@Override
public T apply( @NonNull HttpResult< T> tHttpResult) throws Exception {
if (tHttpResult.getStatus() != NetWorkState. SUCCEES) {
Message message = new Message() ;
message. obj = tHttpResult.getMessage() ;
handler.sendMessage(message) ;
throw new ApiException() ;
}
return tHttpResult.getResult() ;
}
}
static Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg) ;
switch (msg. what) {
case 0:
String data = (String) msg. obj ;
ToastUtils. showShort(data) ;
break;
default:
break;
}
}
} ;
@Override
public T apply( @NonNull HttpResult< T> tHttpResult) throws Exception {
if (tHttpResult.getStatus() != NetWorkState. SUCCEES) {
Message message = new Message() ;
message. obj = tHttpResult.getMessage() ;
handler.sendMessage(message) ;
throw new ApiException() ;
}
return tHttpResult.getResult() ;
}
}
static Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg) ;
switch (msg. what) {
case 0:
String data = (String) msg. obj ;
ToastUtils. showShort(data) ;
break;
default:
break;
}
}
} ;