基本上我有一个套接字类在我正在运行的活动的后台运行,该活动由活动初始化。会发生什么事情,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:在onCreate()之前,活动无法使用系统服务,我真的不明白这意味着什么。
答案 0 :(得分:1)
如果Chat
是活动,则执行以下操作并不好:
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);
}
}
如果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
}
}
看看这是否适合你。
答案 1 :(得分:0)
可能是你在另一个线程而不是现在允许的UI线程中更新你的UI,所以尝试在runOnUiThread()
方法中运行你的UI代码
runOnUiThread(new Runnable() {
@Override
public void run() {
// your ui code
}
});