Android PushNotification IntentService и вызов функции AsyncTask для получения данных из базы данных сервера и обновления базы данных sqlite.

Я разрабатываю приложение для чата на платформе Android. Что я собираюсь сделать, так это когда приложение получит Push-уведомление в функции onHandleIntent (). Приложение вызовет функцию AsyncTask (). Функция AsyncTask () вызывает php-сервер и получает данные с PHP-сервера. Затем я получу данные и вставлю их в базу данных SQLite на моем телефоне. Вот мой код:

public class GCMNotificationIntentService extends IntentService {

public static final int NOTIFICATION_ID = 1;
private NotificationManager mNotificationManager;
NotificationCompat.Builder builder;

public GCMNotificationIntentService() {
super("GcmIntentService");
}

public static final String TAG = "GCMNotificationIntentService";

@Override
protected void onHandleIntent(Intent intent) {
Bundle extras = intent.getExtras();
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);

String messageType = gcm.getMessageType(intent);

if (!extras.isEmpty()) {
if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) {
sendNotification("Send error: " + extras.toString());

} else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) {
sendNotification("Deleted messages on server: " + extras.toString());

} else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) {

for (int i = 0; i < 3; i++) {
Log.i(TAG, "Working... " + (i + 1) + "/5 @ " + SystemClock.elapsedRealtime());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
}
Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime());
sendNotification("Message Received from Google GCM Server: " + extras.getString("message"));
Log.i(TAG, "Received: " + extras.toString());
new GetContacts().execute();
}
}
GcmBroadcastReceiver.completeWakefulIntent(intent);
}

private void sendNotification(String msg) {
Log.d(TAG, "Preparing to send notification...: " + msg);
mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this).setSmallIcon(R.drawable.gcm_logo)
.setContentTitle("GCM Notification")
.setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
.setContentText(msg);

mBuilder.setContentIntent(contentIntent);
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
Log.d(TAG, "Notification sent successfully.");
}private class GetContacts extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}

@Override
protected Void doInBackground(Void... arg0) {
HttpHandler sh = new HttpHandler();
String url = "http://131.4.44.69/JSON/index.php";
String jsonStr = sh.makeServiceCall(url);

if (jsonStr != null) {
try {
JSONObject jsonObj = new JSONObject(jsonStr);
JSONArray contacts = jsonObj.getJSONArray("contacts");

for (int i = 0; i < contacts.length(); i++) {
JSONObject c = contacts.getJSONObject(i);
String id = c.getString("id");
String name = c.getString("name");
String email = c.getString("email");
String address = c.getString("address");
String gender = c.getString("gender");

JSONObject phone = c.getJSONObject("phone");
String mobile = phone.getString("mobile");
String home = phone.getString("home");
String office = phone.getString("office");

HashMap<String, String> contact = new HashMap<>();
contact.put("id", id);
contact.put("name", name);
contact.put("email", email);
contact.put("mobile", mobile);

}
} catch (JSONException e) {
e.printStackTrace();
}

}

return null;
}

@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
}
}

}

Но проблема в том, что я не могу вызвать AsyncTask () в классе IntentService. Как я могу решить эту проблему?

0

Решение

Служба Intent уже запущена в фоновом потоке, вам не нужно вызывать асинхронную задачу. Вы можете напрямую поразить API внутри метода onHandleIntent (), поскольку он уже находится в фоновом потоке.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]