The GCM Sample Project дает затушил пример отправки маркера GCM на сервер:Android 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 дает это в качестве своего примера для отправки вашего токена на ваш сервер?
IntentService имеет выделенный фоновый поток, на котором он работает. Поэтому вам не нужно запускать HTTP-вызов в другом потоке, вместо этого использовать текущий фоновый поток. Если вы действительно хотите использовать выделенный поток для вызова веб-сервиса, вы можете предотвратить выполнение Intent Service onHandleIntent с помощью CountdownLatch. Но это нехороший подход. Пожалуйста, поделитесь своими материалами? –
@SagarTrehan извините, я не понимаю, что вы имеете в виду, когда говорите «вам не нужно начинать HTTP-вызов в другом потоке, а не в текущем фоновом потоке пользователя». Я запускаю HTTP-вызов в текущем потоке, но проблема с асинхронным обратным вызовом, которая передается вызову библиотеки http. –