因此,大多数问题都在标题中。

我已经在GCMIntentService中设置了所有功能,以便在一个函数中进行sendbroadcast(intent)。但是,当我尝试在另一线程中执行此操作时,出现此错误“将消息发送到死线程上的处理程序”。代码是完全一样的,对一个人而言是完美的,而对于其他任何想法都完美吗?

@Override
protected void onMessage(Context context, Intent intent) {
  Log.i(TAG, "Received message");
  final String message = intent.getExtras().getString("clicked");
  if(message == null)
    Toast.makeText(context, getResources().getString(R.string.message_null),      Toast.LENGTH_SHORT).show();
  else if(message.split("\\|")[0].equals("updateMessageInvisible")) {
    onReceiveUpdateMessageInvisible(message);
  } else if(message.split("\\|")[0].equals("message")) {
    onReceiveMessage(message);
  }
}


这个很好用。

private void onReceiveMessage(String message) {
  //Stuff happening (accessing database mostly)

  //Notify listView of Message that it has new data
  Intent i = new Intent("com.crisis.app.NEW_MESSAGE");
  sendBroadcast(i);
}


这是行不通的。

private void onReceiveUpdateMessageInvisible(String message) {
  //Stuff happening (accessing database again)

  //Notify listView of Message that data has been updated
  Intent i = new Intent("com.crisis.app.UPDATE_MESSAGE");
  sendBroadcast(i);
}


我的广播接收器课程:

public final class ReceiveMessage extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent)
  {
    System.out.println("NOTIFY DATA CHANGED");
    //Stuff happening
    //Set adapter with array of message
    adapter = new MessageRowAdapter(context, values);
    listview.setAdapter(adapter);
  }
}


当然,我在onPause和onResume中注册和注销。

因此,如果有人知道为什么它可以在一种情况下起作用,而在没有区别的情况下却不能在另一种情况下起作用……

也许您只能在一个Intent中进行一个senBroadcast?

提前致谢 !

编辑:添加了GCMIntentService的onMessage函数

最佳答案

解决了我的问题。

这是因为我在UIThread之外调用Toast。
Asynctask没有解决它,您必须使用:

new Thread() {
  public void run() {
    mainActivity.runOnUiThread(new Runnable() {
      public void run() {
        Toast.makeText(context, getResources().getString(R.string.message_null), Toast.LENGTH_SHORT).show();
      }
    });
  }
}.start();

08-16 05:00