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がアクティビティの場合、次のことを行うのは良くありません。

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
    }
}

これがうまくいくかどうかを確認してください。

于 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 に答える