当前位置: 首页 > 知识库问答 >
问题:

什么会导致改型忽略方法调用?

童铭晨
2023-03-14

我遇到了一种奇怪的行为。我的应用程序有一个主要活动,由navdrawer布局和默认列表片段组成。列表片段使用改造客户端获取内容。选择列表项时,将显示详细视图。在小屏幕上,通过单独的活动加载详细信息视图。该活动还使用改装客户端获取详细信息。然后,可以从生成新活动的navdrawer中选择一个选项。该活动也使用改造客户端发送数据。

列表和详细活动很好地调用了改造方法。我可以看到日志和事情正在按预期工作。但是,通过导航选项打开的第三个活动尝试调用Retromet忽略的Retromet客户端方法。

在所有情况下,Retromet客户端都以相同的方式实例化:

protected ServerApi buildApi(String serverEndpoint) {
    Gson gson = new GsonBuilder()
            .create();

    RestAdapter restAdapter = new RestAdapter.Builder()
            .setLog(new AndroidLog("ServerApi"))
            .setLogLevel(RestAdapter.LogLevel.FULL)
            .setEndpoint(serverEndpoint)
            .setErrorHandler(new ApiErrorHandler())
            .setConverter(new GsonConverter(gson))
            .build();

    return restAdapter.create(ServerApi.class);
}

在列表和详细活动中,我可以看到详细的改造日志条目。但是,当我在第三个活动中调用类似构造的Retromet客户端时,没有日志输出,没有抛出错误,logcat不会打印任何内容。它几乎就像调用被忽略。

我确信服务器endpoint已正确设置,并且我还确保调用已执行。起初,我认为这可能是由于在onCreate中创建客户端,并在单独的线程上执行。然而,在客户端创建之后立即进行测试调用不会产生任何结果。

有人知道是什么原因导致这种奇怪的行为仅仅在一项活动中,而不是在其他活动中?

更新1

是的,我试着到处伐木。我更绝望的改造客户端构建是这样的:

protected class ApiErrorHandler implements ErrorHandler {
    @Override
    public Throwable handleError(RetrofitError cause) {
        Log.e(TAG, "Got API error " + cause);

        Response r = cause.getResponse();
        Throwable throwable = null;

        if (r == null) {
            return cause;
        }

        // Try to interpret the response
        String responseBody = new String(((TypedByteArray) r.getBody()).getBytes());
        Gson gson = new GsonBuilder().create();
        BaseResponse response = null;

        try {
            response = gson.fromJson(responseBody, BaseResponse.class);
        }
        catch (Exception e) {
            Log.e(TAG, "Could not parse the error response:" + e.getMessage());
        }

        return new ServerApiException(response.getErrorMessage());
    }
}

protected class ApiRequestInterceptor implements RequestInterceptor {
    @Override
    public void intercept(RequestFacade request) {
        Log.d(TAG, "Intercepted API request: " + request.toString());
    }
}

RestAdapter restAdapter = new RestAdapter.Builder()
    .setLog(new AndroidLog("ServerApi"))
    .setLogLevel(RestAdapter.LogLevel.FULL)
    .setEndpoint(mServerUrl)
    .setErrorHandler(new ApiErrorHandler())
    .setConverter(new GsonConverter(gson))
    .setRequestInterceptor(new ApiRequestInterceptor())
    .setProfiler(new Profiler() {
        @Override
        public Object beforeCall() {
            Log.d("RetrofitProfiler", "Before call to retrofit");
            return null;
        }

        @Override
        public void afterCall(Profiler.RequestInformation requestInfo, long elapsedTime, int statusCode, Object beforeCallData) {
            Log.d("RetrofitProfiler", String.format("HTTP %d %s %s (%dms)",
                    statusCode, requestInfo.getMethod(), requestInfo.getRelativePath(), elapsedTime));
        }
    })
    .build();

更新2

好吧,我错了,但不知道改型至少需要一个订户在场。我想这是有道理的,现在我想起来了。。。但它不是火和遗忘。

我做错了什么:

mClient = new ServerClient(mServerEndpoint, mAccountToken);
mUvClient.getFeed(mFeedId);

这是我不知道的部分。您需要订阅observable以使其执行:

mClient = new ServerClient(mServerEndpoint, mAccountToken);
mUvClient.getFeed(mFeedId)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Subscriber<FeedInfo>() {
        @Override
        public void onNext(FeedInfo feedInfo) {
            Log.d(TAG, "on Next");
        }

        @Override
        public void onCompleted() {
            Log.d(TAG, "on completed");
        }

        @Override
        public void onError(Throwable e) {
            Log.d(TAG, "on error");
        }
    });

这将生成预期的改装详细日志和结果。不管怎样,我希望这能帮助别人。

共有1个答案

荣沈义
2023-03-14

问题是我没有订阅改型API生成的可观察性。我以为它无论如何都会启动,但它没有,需要订阅。希望这能帮助其他可能遇到这个问题的人。

 类似资料:
  • 我正在开发一个需要从服务器下载数据的移动应用程序。它工作得很好,但在对服务器进行了一些更改后,来自改装的GET请求停止工作。它成功地发出请求,有时甚至得到成功的响应,但它从不调用onResponse()或onFailure()方法,因此应用程序只能挂起。 基本上有两种情况: 请求正确完成。Okhttp收到响应并打印内容,但它以一条消息结束(“阅读:意外的EOF!”)。之后应用程序停止工作。它不会冻

  • 问题内容: 好吧,我试图理解并阅读可能导致它的原因,但我却无法理解: 我的代码中有这个地方: 事实是,当它尝试调用某些方法时,它将引发而不是其他预期的异常(特别是)抛出 。我实际上知道调用了什么方法,所以我直接转到该方法代码,并为应该抛出的行添加了一个块 ,它实际上按预期抛出。然而,当它上升时,以某种方式更改了上面的代码并没有 按预期进行。 是什么原因导致这种行为的?我该如何检查? 问题答案: 通

  • 如果在Java代码中调用,下面的方法将警告,但将忽略Kotlin中的任何警告,因为是已检查的异常。 Java迫使开发人员在抛出异常时采取安全措施,但在Kotlin中,它只是忽略了异常,从而产生了潜在的bug源。我确信有很多类似的情况,检查的异常被忽略了。 问题是如何处理这样的案件?

  • 场景: 我只有一个生产者和消费者,只有一个队列来传输消息。使用者将根据已使用该值的消息更新DB上的值。不应将任何操作并行发送到DB。所以,我们不应该做任何导致数据库上数据并发的事情。我使用一次接收一条消息。删除是否会导致多个操作并行发送到DB?

  • 问题内容: 我正在尝试在包级别使用Hibernate @TypeDef批注,这与Hibernate文档中所描述的完全相同。我正在使用和。代码可以编译,并且在类路径中,但是Hibernate仍然看不到它。 如果我上课,那是行得通的,但是如果我把放在那,那是没有用的。我试图用Google搜索,但找不到任何有用的信息。 谢谢! 问题答案: 您可能需要添加一个 到您的Hibernate配置文件,或调用co

  • 问题内容: 即使模型类中没有验证约束,我也会收到此错误(所有成员变量均已正确设置,但我在创建对象时仍然遇到此异常)。如何调试此错误? 问题答案: 每个都有一个数组。每个显示了您要保留的bean的哪个属性被侵犯。正如@Arthur正确指出的那样,违反Java持久性注释的结果也以s 结尾。 要调试你的问题,我会暂时赶在并打印出每个如下: