将数据从后台运行的类传递到当前正在运行的活动

时间:2013-07-21 00:58:24

标签: android android-activity

基本上我有一个套接字类在我正在运行的活动的后台运行,该活动由活动初始化。会发生什么事情,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()之前,活动无法使用系统服务,我真的不明白这意味着什么。

2 个答案:

答案 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
     }
   });