Java 什么会导致改型忽略方法调用?
我遇到了一种奇怪的行为。我的应用程序有一个主要活动,由navdrawer布局和默认列表片段组成。列表片段使用改造客户端获取内容。选择列表项时,将显示详细视图。在小屏幕上,通过单独的活动加载详细信息视图。该活动还使用改装客户端获取详细信息。然后,可以从生成新活动的navdrawer中选择一个选项。该活动也使用改造客户端发送数据 列表和细节活动可以调用改造方法。我可以看到日志,一切正常。但是,通过导航选项打开的第三个活动尝试调用被改型忽略的改型客户端方法 在所有情况下,改造客户端都以相同的方式实例化:Java 什么会导致改型忽略方法调用?,java,android,rest,retrofit,Java,Android,Rest,Retrofit,我遇到了一种奇怪的行为。我的应用程序有一个主要活动,由navdrawer布局和默认列表片段组成。列表片段使用改造客户端获取内容。选择列表项时,将显示详细视图。在小屏幕上,通过单独的活动加载详细信息视图。该活动还使用改装客户端获取详细信息。然后,可以从生成新活动的navdrawer中选择一个选项。该活动也使用改造客户端发送数据 列表和细节活动可以调用改造方法。我可以看到日志,一切正常。但是,通过导航选项打开的第三个活动尝试调用被改型忽略的改型客户端方法 在所有情况下,改造客户端都以相同的方式实例化
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);
}
在列表和详细活动中,我可以看到详细的改装日志条目。然而,当我在第三个活动中调用构造类似的改造客户机时,没有日志传出,没有抛出错误,logcat不会打印任何内容。这几乎就像调用被忽略一样
我确信服务器端点已正确设置,并且我还确保调用已执行。起初,我认为这可能是由于在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生成的可观察性。我以为它无论如何都会启动,但它没有,需要订阅。希望这有助于其他可能遇到此问题的人。您是否在ErrorHandler中记录了任何内容?@Greybeardgeek我已使用一个用于尝试记录任何内容的版本更新了此帖子。@Greybeardgeek我解决了此问题。。。基本上,我将我的活动解构到最低限度:使用setContentView和客户端实例化创建。这仍然没有产生任何结果。然后我想也许我需要指定订阅发生的位置。那也没用。最后,我想为什么不订阅看看。这起作用了:/