レトロフィットを使用して、Android アプリのサーバーから応答を得ようとしています。問題なくリクエストを送信できましたが、コールバックは常に null のようで、失敗も成功もしないようです。これは非常に奇妙に聞こえます。私が理解していない他のことは、改造ログが応答を表示することですが、コールバック変数はそれらを取得していないようです?!
何かが変更されたかどうかを確認するために数秒ごとにサーバーをポーリングすることを意図しています。これを行う方法がわからないため、リクエストを何度も何度も送信しようとしましたが、運が悪く、Observable を使用してもうまくいきませんでした。どちらも機能しているように見えるので、非同期コールバックを使用します(同期は問題ありませんが、Androidはあまり好きではないようです)。
以下は、役に立つかもしれないコードの一部です: get インターフェース:
interface CamFindGet {
@Headers("Authorization: CloudSight XXX")
@GET("/image_responses/{token}")
void getResult(@Path("token") String token,
Callback<resultClassGet> callback);}
残りのアダプター:
final RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(API_URL)
.setLogLevel(RestAdapter.LogLevel.FULL)
.setLog(new RestAdapter.Log() {
@Override
public void log(String msg) {
String[] blacklist = {"Access-Control", "Cache-Control", "Connection", "Content-Type", "Keep-Alive", "Pragma", "Server", "Vary", "X-Powered-By"};
for (String bString : blacklist) {
if (msg.startsWith(bString)) {
return;
}
}
Log.d("Retrofit", msg);
}
}).build();
CamFindGet camFindGet = restAdapter.create(CamFindGet.class);
try { //NOTE : result.getToken() is a valid token
getCamResult(camFindGet, result.getToken());
} catch (InterruptedException e) {
e.printStackTrace();
}
実際の GET リクエスト:
static void getCamResult(CamFindGet camFindGet, String token) throws InterruptedException {
Log.d(TAG, "GET CAM RESULT");
Log.d(TAG, "LOOP");
camFindGet.getResult(token, new Callback<resultClassGet>() {
@Override
public void success(resultClassGet resultClass, Response response) {
//Log.d(TAG, resultClass.getName());
if (resultClass.getStatus().equals("completed") || resultClass.getStatus().equals("not found"))
completedGet = 1;
if(completedGet==1) {
resultString = new String(resultClass.getName());
Log.d(TAG, "RESULT : "+resultString);
}
Log.d(TAG, resultClass.getStatus());
}
@Override
public void failure(RetrofitError retrofitError) {
Log.d(TAG, retrofitError.getMessage());
Log.d(TAG, "FAILURE?");
}
});
}
最後に、ログ:
07-01 17:20:23.838 4626-4650/app D/Retrofit﹕ ---> HTTP GET https://api.cloudsightapi.com/image_responses/dUYO5-77ETRJx4bzjL6LEw
07-01 17:20:23.838 4626-4650/app D/Retrofit﹕ Authorization: CloudSight XXX
07-01 17:20:23.840 4626-4650/app D/Retrofit﹕ ---> END HTTP (no body)
07-01 17:20:23.984 4626-4650/app D/Retrofit﹕ <--- HTTP 200 https://api.cloudsightapi.com/image_responses/dUYO5-77ETRJx4bzjL6LEw (143ms)
07-01 17:20:23.984 4626-4650/app D/Retrofit﹕ : HTTP/1.1 200 OK
07-01 17:20:23.984 4626-4650/app D/Retrofit﹕ Content-Length: 52
07-01 17:20:23.984 4626-4650/app D/Retrofit﹕ Date: Wed, 01 Jul 2015 17:20:35 GMT
07-01 17:20:23.984 4626-4650/app D/Retrofit﹕ ETag: "d5143f21b04e73bd70aa104b52ea7bb7"
07-01 17:20:23.984 4626-4650/app D/Retrofit﹕ Set-Cookie: _imagetag_session=dDE1R1lCQ2xUa0VxOUxXZTNKVzdraHIxNW9UOGpKaGpEVHdwSmhtb1NoSU5Jc2htbUVtZGI0Q2Flc1RZMmtadWZQMnRpTkI3L1ZveFlhaFlrZjY2RHc9PS0tdHZVMGxpcDRjbkF5THlxYlB0MjdUQT09--24783a1b51c595beeb955ac9e860498ad8e7c7cb; path=/; HttpOnly
07-01 17:20:23.984 4626-4650/app D/Retrofit﹕ X-Android-Received-Millis: 1435771223983
07-01 17:20:23.984 4626-4650/app D/Retrofit﹕ X-Android-Response-Source: NETWORK 200
07-01 17:20:23.984 4626-4650/app D/Retrofit﹕ X-Android-Sent-Millis: 1435771223840
07-01 17:20:23.984 4626-4650/app D/Retrofit﹕ X-Content-Type-Options: nosniff
07-01 17:20:23.984 4626-4650/app D/Retrofit﹕ X-Frame-Options: SAMEORIGIN
07-01 17:20:23.984 4626-4650/app D/Retrofit﹕ X-Request-Id: 327b11e7-8f38-431b-97bb-3f1d1738395f
07-01 17:20:23.984 4626-4650/app D/Retrofit﹕ X-Runtime: 0.044161
07-01 17:20:23.984 4626-4650/app D/Retrofit﹕ X-UA-Compatible: chrome=1
07-01 17:20:23.984 4626-4650/app D/Retrofit﹕ X-XSS-Protection: 1; mode=block
07-01 17:20:23.984 4626-4650/app D/Retrofit﹕ [ 07-01 17:20:23.985 4626: 4650 D/Retrofit ]{"status":"completed","name":"green square drawing"}
07-01 17:20:23.985 4626-4650/app D/Retrofit﹕ <--- END HTTP (52-byte body)
注:両方の成功のために、デバッグにいくつかのログが表示されるはずです(FAILURE
? またはget.status()
どちらも表示されません)
編集:私は何かに取り組んでいる可能性があります。どうやら非同期リクエストの場合.setExecutors()
、残りのアダプターを作成する必要があります。現時点でそれがどのように機能するかを理解しようとしています。