首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >RxJava +针对应用编程接口调用改进-> BaseObservable以实现集中响应处理

RxJava +针对应用编程接口调用改进-> BaseObservable以实现集中响应处理
EN

Stack Overflow用户
提问于 2016-09-11 22:50:01
回答 2查看 4K关注 0票数 19

我是RxJava的新手,如果这听起来太新手,请原谅我:-)。

到目前为止,我有一个实现Retofit回调的抽象CallbackClass。在那里,我捕获回调的"onResponse“和"onError”方法,并处理各种错误类型,最后将其转发给自定义实现的方法。我还使用这个集中的类来处理请求/响应、应用程序日志记录和其他事情。

例如:对于来自我的服务器的特定错误代码,我在响应正文中收到一个新的Auth令牌,刷新该令牌,然后clone.enqueue调用。当然,对于来自我的服务器的响应,还有其他几个全局行为。

当前解决方案(不含Rx):

代码语言:javascript
复制
    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方法之前,有没有办法让这种集中的响应处理行为?

我发现这两个链接都有一个很好的起点,但没有一个具体的解决方案。任何帮助都将不胜感激。

Forcing request retry after custom API exceptions in RxJava

Retrofit 2 and RxJava error handling operators

EN

回答 2

Stack Overflow用户

发布于 2016-09-12 14:12:22

您是否考虑过使用rxjava适配器进行改造?https://mvnrepository.com/artifact/com.squareup.retrofit2/adapter-rxjava/2.1.0在gradle文件中添加

代码语言:javascript
复制
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'

这是一个用于改装的接口

代码语言:javascript
复制
public interface Service {
@GET("userauth/login?")
Observable<LoginResponse> getLogin(
        @Query("v") String version,
        @Query("username") String username,
        @Query("password") String password);
}

下面是我的实现

代码语言:javascript
复制
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)。

票数 0
EN

Stack Overflow用户

发布于 2016-10-04 11:42:03

看看你是怎么做到的。下面是api调用和传递请求模型和响应模型。

代码语言:javascript
复制
public interface RestService {
//SEARCH_USER
@POST(SEARCH_USER_API_LINK)
Observable<SearchUserResponse> getSearchUser(@Body SearchUserRequest getSearchUserRequest);
}

这是改造电话,我用的是retrofit2

代码语言:javascript
复制
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调用,在您的活动中调用它。

代码语言:javascript
复制
@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()) {

                }
            });
}

希望这能对你有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39437299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档