0

基本上我有套接字类在我正在运行的活动的后台运行,该活动由活动初始化。发生的情况是,socket.io 服务器上的计算机可以向我发送一条记录到我能够在回调中接收的 android 应用程序的消息,但是我想将该消息传递给当前正在运行的活动,所以我可以使用意图。因为这将再次启动活动。所以这就是我尝试过的。

@Override
    public void on(String event, IOAcknowledge ack, Object... data) {
       // if((JSONObject) data[0]!=null)
        //callback.on(event, (JSONObject) data[0]);
        System.out.println("Server triggered event '" + event + "'");
        //Log.d("Message","Yeah");
        if (event.equals("message")) {
        System.out.println(data[2]);
        //System.out.println("Server sent this '" + data.getString("message") + "'");
        Chat chatter=new Chat();
        chatter.getMsg((String)data[2]);
        }
    }

这是接收回调的方法。如您所见,我在正在运行的活动上调用了一个方法来传递数据。就这个。

public void getMsg(String mssg){
        //System.out.println(mssg);
        HashMap mapper=new HashMap();
        mapper.put("message"mssg);
        mapper.put("name","them");
        chatList.add(mapper);
        //connect.start(msg);
        ListAdapter adapter =new SimpleAdapter(
                Chat.this, chatList,
                R.layout.chat_view, new String[]{"message","name"},
                new int[]{R.id.senderchatMessage, R.id.senderchatName}
                );
        setListAdapter(adapter);
        //return msg;
    }

此方法在活动中。但是我收到一个错误,上面写着 IllegalStateException: System services not available to Activities before onCreate() 我真的不明白这意味着什么。

4

2 回答 2

1

如果Chat是一个Activity,那么做以下事情是不好的:

Chat chatter = new Chat();

我的建议是一种解决方法,可能不被认为是好的做法(或者甚至可能不起作用)。

在 Activity 类中创建一个静态变量 mContext:

public static Context mContext;

....

....

// set it up in your onCreate()
mContext = Chat.this;

进行以下更改:

@Override
public void on(String event, IOAcknowledge ack, Object... data) {
   // if((JSONObject) data[0]!=null)
    //callback.on(event, (JSONObject) data[0]);
    System.out.println("Server triggered event '" + event + "'");
    //Log.d("Message","Yeah");
    if (event.equals("message")) {
    System.out.println(data[2]);
    //System.out.println("Server sent this '" + data.getString("message") + "'");

    Intent newIntent = new Intent(Chat.mContext, Chat.class);

    newIntent.putExtra("MSG", (String)data[2]);

    Chat.mContext.startActivity(newIntent);

    }
}

如果正在运行,则该意图将被 Activity 的onNewIntent()方法拦截。Chat您需要覆盖它。

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    if (intent.hasExtra("MSG")) {
        // Retrieve the message and call getMsg(String)
        getMsg(intent.getStringExtra("MSG"));  // Use the same key as before
    }
}

看看这是否适合你。

于 2013-07-21T02:03:33.280 回答
0

可能是您正在另一个线程中更新您的 UI,而不是现在允许的 UI 线程,因此请尝试在runOnUiThread()方法中运行您的 UI 代码

runOnUiThread(new Runnable() {
     @Override
     public void run() {
      // your ui code
     }
   });
于 2013-07-21T01:04:33.187 回答