2

Я разрабатываю приложение GCM.Android) GCM Token Timing Issue при первом запуске

Моя проблема в том, что при первой установке (запуске) приложения требуется некоторое время, чтобы получить токен GCM. Но мое приложение просто «POST» на сервер, чтобы зарегистрировать пользователя.

Итак, при первом запуске из-за регистрации, когда токен GCM равен нулю, мое приложение всегда регистрирует токен GCM null в первый раз.

Как я могу решить эту проблему?

На самом деле я попытался решить эту проблему с помощью Progressbar, но Progressbar не отображается, как пример проекта GCM, предоставленного Google.

Как вы решаете эту проблему?

ответ

2

Вы должны отправить только маркер на ваш сервер приложений после его возвращенный InstanceID.getToken вызова, который не должен происходить в основном потоке.

Вы должны использовать IntentService, который получит маркер и отправит его на ваш сервер приложений, а затем, если необходимо, вы можете использовать BroadcastReceiver/LocalBroadcastManager, чтобы ваш пользовательский интерфейс знал, когда токен был успешно отправлен на сервер приложений ,

Рассмотрите GCM quickstart sample. В частности, посмотрите на RegistrationIntentService, который получает токен и отправляет его на сервер.

// [START get_token] 
InstanceID instanceID = InstanceID.getInstance(this); 
String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId), 
     GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); 
// [END get_token] 
Log.i(TAG, "GCM Registration Token: " + token); 

// TODO: Implement this method to send any registration to your app's servers. 
sendRegistrationToServer(token); 
+0

мммм. Я только что посмотрел образец, который вы положили, и В примере, который я использовал, я говорю, чтобы сделать sendRegistrationToServer в DoInBackground задачи async. Мне нравится этот путь, но имеет смысл – Rob85

+0

где вы видите эту инструкцию, которую вы можете связать? –

+0

Я попробую и найду его снова – Rob85

1

Это должно быть довольно простое решение. если следовать примеру googles, то регистрация в GCM должна выполняться с использованием класса задач async под названием RegisterApp.

Задача async имеет 3 основных метода OnPreExecute, DoInBackground и OnPostExecute. DoInBackground - это метод, который работает в отдельном потоке, и именно поэтому он не работает в настоящее время. Он не закончил работу с этим потоком, и вы уже отправили пустой регистр на свой сервер. В следующий раз это не будет ошибкой при входе в приложение, потому что более вероятно, что вы сохраните regId в файл и прочитаете его, если ваше приложение уже зарегистрировано в GCM

Вы можете отправить regId на ваш сервер либо в DoInBackground, где вы должны зарегистрироваться в GCM или в OnPostExecute.

Я делаю это в методе DoInBackground прямо после того, как он регистрируется, поскольку это единственная часть, которая работает в отдельном потоке, и если по какой-то причине она не отправляется на мой бэкэнд, она обрабатывается отдельной цепочкой на основной UIThread ,

Не забывайте, что вам также понадобится ваш текущий метод отправки, потому что RegisterApp не будет работать, если ваше приложение уже зарегистрировано.

Надеюсь, это поможет.

Это образец, которым я пользовался. Here

В настоящее время это работает для меня, поскольку деятельность, которая обрабатывает регистрацию, заблокирована на портрете, и не так уж много происходит, но каждый в отдельности.

Артур делает некоторые действительные пункты

+0

Не рекомендуется совершать сетевые вызовы с помощью AsyncTask, используйте что-то вроде IntentService. –

+0

Привет, Артур, теперь вы беспокоитесь о том, что это опасно для этого. – Rob85

+0

AsyncTask предназначен для фоновых задач FAST, сеть не считается быстрой. У этого есть потенциал для утечки действий, например, если пользователь поворачивает экран во время выполнения AsyncTask, см. Эту статью Alex Lockwood о некоторых из ошибок, с которыми вы можете столкнуться при использовании AsyncTask. http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html –

Смежные вопросы