我遇到了一种奇怪的行为。我的应用程序有一个主要活动,由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");
}
});
这将生成预期的改装详细日志和结果。不管怎样,我希望这能帮助别人。
问题是我没有订阅改型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 结尾。 要调试你的问题,我会暂时赶在并打印出每个如下: