2017-04-25 1 views
0

Je développe une application de chat en utilisant la plate-forme Android. Ce que je vais faire est quand l'application reçoit la notification push dans la fonction onHandleIntent(). L'application appellera la fonction AsyncTask(). La fonction AsyncTask() appelle le serveur php et obtient des données de PHP Server. Ensuite, je vais obtenir les données et les insérer dans ma base de données SQLite dans mon téléphone. Ce qui suit est mon code:Android PushNotification IntentService et appeler la fonction AsyncTask pour obtenir des données à partir de la base de données du serveur et mettre à jour la base de données 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); 
    } 
} 

}

Mais le problème est que je ne peux pas appeler AsyncTask() dans la classe IntentService. Comment puis-je résoudre ce problème?

+1

pourquoi asyncTask ici, onHandleIntent s'exécute déjà en arrière-plan Thread. –

Répondre

1

Le service d'intention déjà exécuté dans le thread d'arrière-plan, vous n'avez pas besoin d'une tâche asynchrone pour appeler à l'intérieur. vous pouvez directement frapper l'API à l'intérieur de la méthode onHandleIntent() bcs il est déjà dans un thread d'arrière-plan

+0

Cela signifie que je peux faire HttpURLConnection à l'intérieur de ma fonction IntentService? –

+0

oui vous pouvez directement faire httpUrlConnection dans IntentService –

+0

@Ashrif Ahamad Merci, je comprends –