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 ответ:
Будет ли мой http-запрос отправлен вверх по потоку до того, как onHandleIntent вернется и завершит IntentService?
Учитывая, что вы используете библиотеку с именем "android-async-http", я бы предположил, что по умолчанию она выполняет HTTP асинхронно. Неизвестно, завершит ли вызов
post()
свою работу до возвращенияonHandleIntent()
, но это кажется маловероятным.У Google есть заглушкаПочему Google приводит этот пример для отправки вашего токена на ваш сайт? сервер?
sendRegistrationToServer()
, Как вы можете видеть в вашем первом списке кода. Я не знаю ни одного примера Google, который использует библиотеку "android-async-http".Вы решили использовать асинхронный механизм для отправки этого HTTP-запроса. Что является неподходящим местом для внутри
IntentService
. Теперь, возможно, эта библиотека имеет синхронный вариант, и в этом случае вы можете переключиться на него. В противном случае используйте что-то другое Синхронное для запроса HTTP (HttpURLConnection
, Охттп3 и др.) изIntentService
.Обратите внимание, что волейбол не является идеальной отправной точкой здесь, в той мере, в волейбол тоже сильно накренился в сторону асинхронной работы.