HTTP リクエストで奇妙な動作が発生しています。この呼び出しが戻ってくることはないと言っているユーザーが何人かいます (非同期呼び出しであることを示すスピナーが消えることはありません)。以前にこれが発生するのを見たことがありますが、Charles Proxy を経由するエミュレーターが原因であると考えました。私はまだ実際の電話でそれを見たことがありません。
何が原因なのかわからないので、ここに投稿します。Jackson を使用して結果を値オブジェクトに逆シリアル化する呼び出しは次のとおりです。エミュレーターのフリーズが見られた 2 つのスポットは、httpclient.execute(httpGet); です。getObjectMapper().readValue(jp, SyncVO.class);.
デバッグ中に、問題のあるステートメントをステップ オーバーすると、デバッガーがステップ実行の制御を取り戻すことができませんでした。その間、リクエストが送信され、Charles を介してサーバーから戻ってくるのがわかります。アプリが応答を取得していないようで、ただそこに座っているだけです.
というわけで、これがコードです。助けてくれてありがとう!
public SyncVO sync(String userId, long lastUpdate, boolean includeFetch) throws IOException {
SyncVO result = null;
String url = BASE_URL + "users/" + userId + "/sync" + "?" + "fetch=" + includeFetch;
if (lastUpdate > 0) {
url += "&updatedSince=" + lastUpdate;
}
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
httpGet.setHeader("Accept", "application/json");
httpGet.setHeader("Accept-Encoding", "gzip");
httpGet.setHeader(AUTHORIZATION, BEARER + " " + mOAuthToken);
httpclient.getParams().setParameter(CoreProtocolPNames.USER_AGENT, USER_AGENT_STRING);
httpclient.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);
HttpResponse response = httpclient.execute(httpGet);
if (isUnauthorized(response)) {
APPLICATION.needReauthentication();
return null;
}
if (response != null) {
InputStream stream = response.getEntity().getContent();
Header contentEncoding = response.getFirstHeader("Content-Encoding");
if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) {
stream = new GZIPInputStream(stream);
}
InputStreamReader inReader = new InputStreamReader(stream, "UTF-8");
JsonParser jp = mJsonFactory.createJsonParser(inReader);
result = getObjectMapper().readValue(jp, SyncVO.class);
}
return result;
}
private ObjectMapper getObjectMapper() {
return (new ObjectMapper()
.configure(Feature.AUTO_DETECT_FIELDS, true)
.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true));
}