Проблемы с получением ответа от сервера с помощью модернизации

Я пытаюсь получить ответ от сервера для Android-приложения с помощью модернизации. Мне удается отправить запрос без проблем, но обратный вызов, кажется, всегда нулевой, а также, кажется, никогда не происходит сбой или успех, что звучит очень странно. Что-то еще, чего я не понимаю, это то, что модифицированный журнал действительно показывает ответ, но переменные обратного вызова, кажется, не получают их?!

Я должен опрашивать сервер каждые несколько секунд, чтобы проверить, изменилось ли что-то, я не уверен, как это сделать, поэтому я пытался просто отправлять запрос снова и снова, но безуспешно, и использование 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)

ПРИМЕЧАНИЕ: для успеха оба LOG должны появиться в отладке (либо FAILURE? или же get.status() но не делает)

РЕДАКТИРОВАТЬ: Я мог бы быть на что-то, по-видимому, для асинхронных запросов вам нужно иметь .setExecutors() в создании адаптера остальных я пытаюсь понять, как это будет работать в данный момент.

1 ответ

Проблема решена, просто нужно было создать исполнителя следующим образом:

Executor executor = Executors.newCachedThreadPool();

А затем при создании адаптера rest добавьте строку setExecutors:

 RestAdapter.Builder builder = new RestAdapter.Builder();
    builder.setEndpoint(API_URL);
    builder.setLogLevel(RestAdapter.LogLevel.FULL);
    builder.setExecutors(executor, null); //<<-- this line
    builder.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);
        }
    });
Другие вопросы по тегам