Android GCM отправляет токен на сервер


Пример проекта GCM дает заглушенный пример отправки маркера GCM на ваш сервер:

public class RegistrationIntentService extends IntentService {

    ...

    @Override
    protected void onHandleIntent(Intent intent) {
        try {
            ...
            String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),
                    GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

            Log.i(TAG, "GCM Registration Token: " + token);

            // TODO: Implement this method to send any registration to your app's servers.
            sendRegistrationToServer(token);
            ...
        } catch (Exception e) {
            ...
        }
    }

    /**
     * Persist registration to third-party servers.
     *
     * Modify this method to associate the user's GCM registration token with any server-side account
     * maintained by your application.
     *
     * @param token The new token.
     */
    private void sendRegistrationToServer(String token) {
        // Add custom implementation, as needed.
    }
}

Но это делается в IntentService, который заканчивается, как только onHandleIntent возвращается правильно? Поэтому, если начать http-вызов для отправки токена с популярной библиотекойandroid-async-http , я даже не вижу своего onStart хита:

private void sendRegistrationToServer(String token) {
    post("/devices", params, new AsyncHttpResponseHandler() {
        // TODO: MAKE SURE ONSTART ACTUALLY CALLED TO MAKE SURE REQUEST AT LEAST GOES UPSTREAM EVEN IF I DON'T RECEIVE A CALLBACK SINCE IN INTENTSERVICE
        // IF NOT THEN MIGHT HAVE TO CHANGE THE INTENTSERVICE TO A SERVICE FOR DEVICE REGISTRATION
        @Override
        public void onStart() {
            // not actually using callback because request sent from intentservice
            Log.d("tagzzz", "sending upstream");
        }

        @Override
        public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
            // not actually using callback because request sent from intentservice
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
            // not actually using callback because request sent from intentservice
        }
    });
}

Будет ли мой http-запрос отправлен вверх по потоку до того, как onHandleIntent вернется и завершит IntentService? Если нет, то почему Google приводит этот пример для отправки вашего токена на ваш сервер?

1 2

1 ответ:

Будет ли мой http-запрос отправлен вверх по потоку до того, как onHandleIntent вернется и завершит IntentService?

Учитывая, что вы используете библиотеку с именем "android-async-http", я бы предположил, что по умолчанию она выполняет HTTP асинхронно. Неизвестно, завершит ли вызов post() свою работу до возвращения onHandleIntent(), но это кажется маловероятным.

Почему Google приводит этот пример для отправки вашего токена на ваш сайт? сервер?

У Google есть заглушка sendRegistrationToServer(), Как вы можете видеть в вашем первом списке кода. Я не знаю ни одного примера Google, который использует библиотеку "android-async-http".

Вы решили использовать асинхронный механизм для отправки этого HTTP-запроса. Что является неподходящим местом для внутри IntentService. Теперь, возможно, эта библиотека имеет синхронный вариант, и в этом случае вы можете переключиться на него. В противном случае используйте что-то другое Синхронное для запроса HTTP (HttpURLConnection, Охттп3 и др.) из IntentService.

Обратите внимание, что волейбол не является идеальной отправной точкой здесь, в той мере, в волейбол тоже сильно накренился в сторону асинхронной работы.