2015-08-24 35 views
1

我用這個代碼GCM,但是當我pushnotification,我得到的錯誤是這樣的:GCM IntentService

> 08-24 09:28:31.670 25605-5683/icon.apkt E/AndroidRuntime﹕ FATAL 
> EXCEPTION: IntentService[GCMIntentService-43597399078-11] 
>  android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
>    at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:5503) 
>    at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1099) 
>    at android.view.ViewGroup.invalidateChildFast(ViewGroup.java:4417) 
>    at android.view.View.invalidateViewProperty(View.java:11201) 
>    at android.view.ViewPropertyAnimator$AnimatorEventListener.onAnimationUpdate(ViewPropertyAnimator.java:1047) 
>    at android.animation.ValueAnimator.animateValue(ValueAnimator.java:1166) 
>    at android.animation.ValueAnimator.animationFrame(ValueAnimator.java:1102) 
>    at android.animation.ValueAnimator.doAnimationFrame(ValueAnimator.java:1131) 
>    at android.animation.ValueAnimator$AnimationHandler.doAnimationFrame(ValueAnimator.java:616) 
>    at android.animation.ValueAnimator$AnimationHandler.run(ValueAnimator.java:639) 
>    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:791) 
>    at android.view.Choreographer.doCallbacks(Choreographer.java:591) 
>    at android.view.Choreographer.doFrame(Choreographer.java:560) 
>    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:777) 
>    at android.os.Handler.handleCallback(Handler.java:725) 
>    at android.os.Handler.dispatchMessage(Handler.java:92) 
>    at android.os.Looper.loop(Looper.java:137) 
>    at android.os.HandlerThread.run(HandlerThread.java:60) 

這裏是我的代碼:

/** 
* Method called on device un registred 
*/ 
@Override 
protected void onUnregistered(Context context, String registrationId) { 
    Log.i(TAG, "GCM Device unregistered"); 
    generateNotification(context, "Device Unregistered", new Intent()); 
    ServerUtilities.unregister(context, registrationId); 
} 

/** 
* Method called on Receiving a new message 
*/ 
@Override 
protected void onMessage(final Context context, Intent intent) { 
    Log.i(TAG, "GCM Received message"); 
    if (intent == null) { 

    } else { 
    String message = intent.getExtras().getString("message"); 
    String namaPelanggan = "", alamat = "", telepon = "", noGangguan = ""; 
    // { 
    // "reportNumber" : "G5313111100001" 
    // "status" : "Dalam Perjalanan", 
    // "poskoId" : "538711", 
    // "poskoName" : "POSKO DEPOK KOTA", 
    // "reguId" : "6683", 
    // "reguName" : "rdpk55", 
    // "idPel" : "525060659230", 
    // "namaPelanggan" : "SUPRIYADI" , 
    // "createBy" : "11387", 
    // "createName" : "POSKODEPOK", 
    // "namaPelapor" : ""SAMINAH, 
    // "alamat" : "KP PANCORAN MAS", 
    // "telepon" : "021234234", 
    // "hp" : "081234234234", 
    // "longitude" : "0", 
    // "latitude" : "0" 
    // } 

     try { 
      JSONObject json = new JSONObject(message); 
      namaPelanggan = json.getString("namaPelanggan"); 
      alamat = json.getString("alamat"); 
      telepon = json.getString("telepon"); 
      noGangguan = json.getString("reportNumber"); 

      String total = "Gangguan baru diterima, NoGangguan = " + noGangguan 
        + " Pelapor = " + namaPelanggan + ", Lokasi = " + alamat 
        + ", Telepon = " + telepon; 

      // final String nogang = noGangguan; 
      try { 
    //    GenericMethods.ShowToast(context, total); 
       User user = new User(); 
       if (user.fromLocal(context)) { 
        GenericMethods.getGangguanOnline(context, user, 
          new onFinish() { 
           @Override 
           public void complete() { 
            // DO NOTHING 
            // Intent intent = null; 
            // 
            // Gangguan tugas = GenericMethods 
            // .getGangguan(nogang); 
            // 
            // if (tugas == null) { 
            // Log.i("RETURN", "NULL"); 
            // return; 
            // } 
            // 
            // Log.i("SELECT", tugas.LASTSTATUS); 
            // if (tugas.LASTSTATUS 
            // .equalsIgnoreCase(WSDLConfig.status.status0)) 
            // { 
            // intent = new Intent(context, 
            // BerangkatActivity.class); 
            // Log.d("GCM Open", tugas.LASTSTATUS); 
            // } else if (tugas.LASTSTATUS 
            // .equalsIgnoreCase(WSDLConfig.status.status1)) 
            // { 
            // intent = new Intent(context, 
            // SebelumActivity.class); 
            // Log.d("GCM Open", tugas.LASTSTATUS); 
            // } else if (tugas.LASTSTATUS 
            // .equalsIgnoreCase(WSDLConfig.status.status2)) 
            // { 
            // intent = new Intent(context, 
            // SesudahActivity.class); 
            // Log.d("GCM Open", tugas.LASTSTATUS); 
            // } else if (tugas.LASTSTATUS 
            // .equalsIgnoreCase(WSDLConfig.status.status3)) 
            // { 
            // intent = new Intent(context, 
            // SesudahActivity.class); 
            // Log.d("GCM Open", tugas.LASTSTATUS); 
            // } else if (tugas.LASTSTATUS 
            // .equalsIgnoreCase(WSDLConfig.status.status4)) 
            // { 
            // intent = new Intent(context, 
            // SelesaiActivity.class); 
            // Log.d("GCM Open", tugas.LASTSTATUS); 
            // } 
            // 
            // if (intent != null) { 
            // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
            // intent.putExtra(
            // Configuration.put_runworkflowID, 
            // tugas.REPORTNUMBER); 
            // startActivity(intent); 
            // } 
            // if (GenericMethods.activeActivity != null) 
            //  ((MainActivity) GenericMethods.activeActivity) 
            //   .getDaftarGangguanOffline(); 
           } 
          }); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      DBHelper db = new DBHelper(context); 
      db.insertGCMList(noGangguan, total); 
      db.close(); 
      Log.i("GCM","GCM Notif"); 
      generateNotification(getApplicationContext(), total, new Intent(
        getApplicationContext(), MainActivity.class)); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
+0

我想你想顯示的UI使用背景thread..So,你有這個只有原來的線程DATAS創建視圖層次結構可以觸及其視圖異常。 – Vishwa

+0

使用處理程序與GCMIntentService中的UI元素交互,因爲它是後臺線程。 –

回答

0

唯一的例外是不是GCM,這是因爲您嘗試在意向服務中更新您的UI,意圖服務實際上在單獨的線程中運行。 Android不允許在非主線程中更新UI。

嘗試移動您的更新UI代碼到主線程,這裏只是舉個例子:

new Handler(getMainLooper()).post(new Runnable() { 
     @Override 
     public void run() { 
      // put your update UI code here. 
     } 
    });