2017-04-25 185 views
0

我正在開發一個使用Android平臺的聊天應用程序。我要做的是應用程序在onHandleIntent()函數中接收推送通知。該應用程序將調用AsyncTask()函數。 AsyncTask()函數調用php服務器並從PHP服務器獲取數據。接下來,我將獲取數據並插入手機中的SQLite數據庫。下面是我的代碼:Android PushNotification IntentService並調用AsyncTask函數從服務器數據庫獲取數據並更新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); 
    } 
} 

}

但問題是我不能IntentService類中調用的AsyncTask()。我怎麼解決這個問題?

+1

爲什麼你在這裏使用asyncTask,onHandleIntent已經在後臺線程中執行了。 –

回答

1

意向服務已經在後臺線程中運行,您不需要任何異步任務來調用。你可以直接在aHandleIntent()方法裏面打api它已經在後臺線程中了

+0

這意味着我可以在我的IntentService函數中執行HttpURLConnection? –

+0

是的,你可以直接在IntentService中做httpUrlConnection –

+0

@Ashrif Ahamad謝謝,我明白了 –

相關問題