我是RxJava的新手,如果这听起来太新手,请原谅我:-)。
到目前为止,我有一个实现Retofit回调的抽象CallbackClass。在那里,我捕获回调的"onResponse“和"onError”方法,并处理各种错误类型,最后将其转发给自定义实现的方法。我还使用这个集中的类来处理请求/响应、应用程序日志记录和其他事情。
例如:对于来自我的服务器的特定错误代码,我在响应正文中收到一个新的Auth令牌,刷新该令牌,然后clone.enqueue调用。当然,对于来自我的服务器的响应,还有其他几个全局行为。
当前解决方案(不含Rx):
public abstract void onResponse(Call<T> call, Response<T> response, boolean isSuccess);
public abstract void onFailure(Call<T> call, Response<T> response, Throwable t, boolean isTimeout);
@Override
public void onResponse(Call<T> call, Response<T> response) {
if (_isCanceled) return;
if (response != null && !response.isSuccessful()) {
if (response.code() == "SomeCode" && retryCount < RETRY_LIMIT) {
TokenResponseModel newToken = null;
try {
newToken = new Gson().fromJson(new String(response.errorBody().bytes(), "UTF-8"), TokenResponseModel.class);
} catch (Exception e) {
e.printStackTrace();
}
SomeClass.token = newToken.token;
retryCount++;
call.clone().enqueue(this);
return;
}
}
} else {
onResponse(call, response, true);
removeFinishedRequest();
return;
}
onFailure(call, response, null, false);
removeFinishedRequest();
}
@Override
public void onFailure(Call<T> call, Throwable t) {
if (_isCanceled) return;
if (t instanceof UnknownHostException)
if (eventBus != null)
eventBus.post(new NoConnectionErrorEvent());
onFailure(call, null, t, false);
removeFinishedRequest();
}
我的问题是:在最终链接(或重试)回subscriber方法之前,有没有办法让这种集中的响应处理行为?
我发现这两个链接都有一个很好的起点,但没有一个具体的解决方案。任何帮助都将不胜感激。
发布于 2016-09-12 14:12:22
您是否考虑过使用rxjava适配器进行改造?https://mvnrepository.com/artifact/com.squareup.retrofit2/adapter-rxjava/2.1.0在gradle文件中添加
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
这是一个用于改装的接口
public interface Service {
@GET("userauth/login?")
Observable<LoginResponse> getLogin(
@Query("v") String version,
@Query("username") String username,
@Query("password") String password);
}
下面是我的实现
Service.getLogin(
VERSION,
"username",
"password")
.subscribe(new Subscriber<LoginResponse>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(LoginResponse loginResponse) {
}
});
请注意,我使用了gson转换器工厂来解析我的响应,因此我得到了一个返回的pojo (Plain Ole Java Object)。
发布于 2016-10-04 11:42:03
看看你是怎么做到的。下面是api调用和传递请求模型和响应模型。
public interface RestService {
//SEARCH_USER
@POST(SEARCH_USER_API_LINK)
Observable<SearchUserResponse> getSearchUser(@Body SearchUserRequest getSearchUserRequest);
}
这是改造电话,我用的是retrofit2
public RestService getRestService() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ApiConstants.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(getOkHttpClient())
.build();
return retrofit.create(RestService.class);
}
//get OkHttp instance
@Singleton
@Provides
public OkHttpClient getOkHttpClient() {
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.interceptors().add(httpLoggingInterceptor);
builder.readTimeout(60, TimeUnit.SECONDS);
builder.connectTimeout(60, TimeUnit.SECONDS);
return builder.build();
}
这是api调用,在您的活动中调用它。
@Inject
Scheduler mMainThread;
@Inject
Scheduler mNewThread;
//getSearchUser api method
public void getSearchUser(String user_id, String username) {
SearchUserRequest searchUserRequest = new SearchUserRequest(user_id, username);
mObjectRestService.getSearchUser(searchUserRequest).
subscribeOn(mNewThread).
observeOn(mMainThread).
subscribe(searchUserResponse -> {
Timber.e("searchUserResponse :" + searchUserResponse.getResponse().getResult());
if (isViewAttached()) {
getMvpView().hideProgress();
if (searchUserResponse.getResponse().getResult() == ApiConstants.STATUS_SUCCESS) {
} else {
}
}
}, throwable -> {
if (isViewAttached()) {
}
});
}
希望这能对你有所帮助。
https://stackoverflow.com/questions/39437299
复制相似问题