我正在尝试创建generlize方法来处理以下内容
>来自webservice的回复
>处理HTTP错误和自定义错误
因为我已经编写了以下代码和crated回调来处理响应ResponseCallback和错误ErrorCallback.
要获取与营养或任何其他对象相关的数据,我可以使用相同的回调.
Request request = new Request();
request.setAccess_token("d80fa6bd6f78cc704104d61146c599bc94b82ca225349ee68762fc6c70d2dcf0");
request.setStart_date("2018-06-01T00:00:00");
Flowable<Response> fitnessFlowable = new WebRequest()
.getRemoteClient()
.create(FitnessApi.class)
.getFitnessData("5b238abb4d3590001d9b94a8",request.toMap());
fitnessFlowable.subscribeOn(Schedulers.io())
.takeUntil(response->response.getSummary().getNext()!=null)
.doOnNext(new ResponseCallback())
.doOnError(new ErrorCallback<Throwable>())
.subscribe();
响应回调
public class ResponseCallback<T extends Response> implements Consumer<Response> {
@Override
public void accept(Response response) throws Exception {
if(response ==null || response.getFitness() == null || response.getFitness().isEmpty()) {
new Exception("NUll response");
}
RxBus.getInstance().send(response.getFitness());
Log.e("Data","accept");
try(Realm r = Realm.getDefaultInstance()) {
r.executeTransaction((realm) -> {
realm.copyToRealmOrUpdate(response.getFitness());
});
}
}
}
错误回调
public class ErrorCallback <T extends Throwable> implements Consumer<Throwable> {
public static final String TAG = "ErrorCallback";
@Override
public void accept(Throwable e) throws Exception {
if (e instanceof HttpException) {
ResponseBody body = ((HttpException) e).response().errorBody();
try {
Response response= LoganSquare.parse(body.byteStream(),Response.class);
if(response.getErrors() !=null)
if(response.getErrors().size() > 0)
Log.e(TAG , response.getErrors().get(0).getErrors() );
} catch (IOException t) {
t.printStackTrace();
}
} else if (e instanceof SocketTimeoutException) {
Log.e(TAG , e.getMessage() );
}else if (e instanceof IOException) {
Log.e(TAG , e.getMessage() );
}else{
Log.e(TAG , e.getMessage() );
}
}
}
这里有两个问题我想解决
>要处理响应和错误,我需要进行两次单独的回调.有没有其他方法可以处理回调中的响应和错误,而不是创建两个单独的
>我什么时候应该在上面的代码中处理订阅,因为你可以在我的代码中看到我的订阅是hagging.
我已经将this link用于设计推广方法.
最佳答案 解决问题#1 –
To handle response and error i need to make two separate callbacks. is
there any other way where i can handle response and error in callback
rather than creating two separate one
在Clean Architecture方法中,您的Web服务将被定义为RemoteDataSource(可能遵循’DataSource’协议.RemoteDataSource应该以类格式序列化它的结果 – 如果您能够使用Kotlin,那么sealed class是一个很好的选择在这里(如果Kotlin不是一个选项 – 🙁 – 然后看Enums或IntDefs).请参阅以下内容:
/**
* The return state from the Data Layer
*/
sealed class ServiceResult {
data class Success(val list: List<MySerializedObject>) : ServiceResult()
data class Error(val reason: Throwable?) : ServiceResult()
}
这允许您从数据层,通过域层(您可以根据结果执行其他逻辑)传递单个状态,最后传递到View层,Presenter可以在此处打开它:
when (result) {
is ServiceResult.Success -> {
serializeToViewModel(result) // VM to the Adapter
}
is ServiceResult.Error -> result.reason?.let {
PartialViewState.Error(it) // Can be rendered immediately
}
}
然后,您的Presenter可以在视图上调用渲染方法,如下所示:
... subscribeOn() etc
.subscribe({ view?.render(it) }, { view?.render(ViewState(error = it)) })
然后,视图的渲染方法可以在切换要呈现的视图状态,要显示的错误消息等之间执行少量逻辑.
仅供参考,我使用的架构在很大程度上依赖于MVI by Hans Dorfmann ……我强烈推荐它.