Android:对象不能作为其非原始线程添加到现有列表中



我正在开发一个Android项目,其中我正在开发聊天功能。在这种情况下,每当收到新消息时,我都必须触摸(字面上)屏幕,然后只能看到新消息。此外,我第一次收到下面提到的错误。如何将对象添加到现有列表中。任何帮助都会很好。非常感谢。

我在ChatListener中得到了最新的消息,然后将其转发给一个方法,该方法将尝试将其添加到适配器中。

整个堆栈:

03-31 14:30:15.578 21164-21484/mycompany.app W/System.err: Handhskare complete[HttpClient@260236492-4456] INFO org.cometd.bayeux.client.ClientSession - Exception while invoking listener mycompany.app.Activity.ChatMessagesActivity$ChatListener@9b922a9
03-31 14:30:15.578 21164-21484/mycompany.app W/System.err: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
03-31 14:30:15.582 21164-21484/mycompany.app W/System.err:     at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6556)
03-31 14:30:15.582 21164-21484/mycompany.app W/System.err:     at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:907)
03-31 14:30:15.582 21164-21484/mycompany.app W/System.err:     at android.view.View.requestLayout(View.java:18722)
03-31 14:30:15.582 21164-21484/mycompany.app W/System.err:     at android.view.View.requestLayout(View.java:18722)
03-31 14:30:15.582 21164-21484/mycompany.app W/System.err:     at android.view.View.requestLayout(View.java:18722)
03-31 14:30:15.582 21164-21484/mycompany.app W/System.err:     at android.view.View.requestLayout(View.java:18722)
03-31 14:30:15.582 21164-21484/mycompany.app W/System.err:     at android.view.View.requestLayout(View.java:18722)
03-31 14:30:15.582 21164-21484/mycompany.app W/System.err:     at android.view.View.requestLayout(View.java:18722)
03-31 14:30:15.582 21164-21484/mycompany.app W/System.err:     at android.support.v4.widget.DrawerLayout.requestLayout(DrawerLayout.java:979)
03-31 14:30:15.582 21164-21484/mycompany.app W/System.err:     at android.view.View.requestLayout(View.java:18722)
03-31 14:30:15.582 21164-21484/mycompany.app W/System.err:     at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:360)
03-31 14:30:15.582 21164-21484/mycompany.app W/System.err:     at android.view.View.requestLayout(View.java:18722)
03-31 14:30:15.582 21164-21484/mycompany.app W/System.err:     at android.widget.AbsListView.requestLayout(AbsListView.java:1975)
03-31 14:30:15.583 21164-21484/mycompany.app W/System.err:     at android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:833)
03-31 14:30:15.583 21164-21484/mycompany.app W/System.err:     at android.widget.AbsListView$AdapterDataSetObserver.onChanged(AbsListView.java:6179)
03-31 14:30:15.583 21164-21484/mycompany.app W/System.err:     at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
03-31 14:30:15.583 21164-21484/mycompany.app W/System.err:     at android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50)
03-31 14:30:15.583 21164-21484/mycompany.app W/System.err:     at mycompany.app.Activity.ChatMessagesActivity.recieveUpdatedMessage(ChatMessagesActivity.java:265)
03-31 14:30:15.583 21164-21484/mycompany.app W/System.err:     at mycompany.app.Activity.ChatMessagesActivity$ChatListener.onMessage(ChatMessagesActivity.java:473)
03-31 14:30:15.583 21164-21484/mycompany.app W/System.err:     at org.cometd.common.AbstractClientSession$AbstractSessionChannel.notifyOnMessage(AbstractClientSession.java:501)
03-31 14:30:15.583 21164-21484/mycompany.app W/System.err:     at org.cometd.common.AbstractClientSession$AbstractSessionChannel.notifyMessageListeners(AbstractClientSession.java:491)
03-31 14:30:15.583 21164-21484/mycompany.app W/System.err:     at org.cometd.common.AbstractClientSession.notifyListeners(AbstractClientSession.java:248)
03-31 14:30:15.583 21164-21484/mycompany.app W/System.err:     at org.cometd.client.BayeuxClient.notifyListeners(BayeuxClient.java:1001)
03-31 14:30:15.583 21164-21484/mycompany.app W/System.err:     at org.cometd.common.AbstractClientSession.receive(AbstractClientSession.java:241)
03-31 14:30:15.583 21164-21484/mycompany.app W/System.err:     at org.cometd.client.BayeuxClient.processMessage(BayeuxClient.java:787)
03-31 14:30:15.583 21164-21484/mycompany.app W/System.err:     at org.cometd.client.BayeuxClient$PublishTransportListener.processMessage(BayeuxClient.java:1193)
03-31 14:30:15.583 21164-21484/mycompany.app W/System.err:     at org.cometd.client.BayeuxClient$ConnectTransportListener.processMessage(BayeuxClient.java:1260)
03-31 14:30:15.583 21164-21484/mycompany.app W/System.err:     at org.cometd.client.BayeuxClient$PublishTransportListener.onMessages(BayeuxClient.java:1185)
03-31 14:30:15.583 21164-21484/mycompany.app W/System.err:     at org.cometd.client.transport.LongPollingTransport$2.onComplete(LongPollingTransport.java:254)
03-31 14:30:15.584 21164-21484/mycompany.app W/System.err:     at org.eclipse.jetty.client.ResponseNotifier.notifyComplete(ResponseNotifier.java:193)
03-31 14:30:15.584 21164-21484/mycompany.app W/System.err:     at org.eclipse.jetty.client.ResponseNotifier.notifyComplete(ResponseNotifier.java:185)
03-31 14:30:15.584 21164-21484/mycompany.app W/System.err:     at org.eclipse.jetty.client.HttpReceiver.terminateResponse(HttpReceiver.java:446)
03-31 14:30:15.584 21164-21484/mycompany.app W/System.err:     at org.eclipse.jetty.client.HttpReceiver.responseSuccess(HttpReceiver.java:393)
03-31 14:30:15.584 21164-21484/mycompany.app W/System.err:     at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.messageComplete(HttpReceiverOverHTTP.java:265)
03-31 14:30:15.584 21164-21484/mycompany.app W/System.err:     at org.eclipse.jetty.http.HttpParser.parseContent(HttpParser.java:1430)
03-31 14:30:15.584 21164-21484/mycompany.app W/System.err:     at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:1272)
03-31 14:30:15.584 21164-21484/mycompany.app W/System.err:     at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.parse(HttpReceiverOverHTTP.java:156)
03-31 14:30:15.584 21164-21484/mycompany.app W/System.err:     at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.process(HttpReceiverOverHTTP.java:117)
03-31 14:30:15.584 21164-21484/mycompany.app W/System.err:     at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.receive(HttpReceiverOverHTTP.java:69)
03-31 14:30:15.584 21164-21484/mycompany.app W/System.err:     at org.eclipse.jetty.client.http.HttpChannelOverHTTP.receive(HttpChannelOverHTTP.java:89)
03-31 14:30:15.584 21164-21484/mycompany.app W/System.err:     at org.eclipse.jetty.client.http.HttpConnectionOverHTTP.onFillable(HttpConnectionOverHTTP.java:108)
03-31 14:30:15.584 21164-21484/mycompany.app W/System.err:     at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540)
03-31 14:30:15.584 21164-21484/mycompany.app W/System.err:     at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
03-31 14:30:15.584 21164-21484/mycompany.app W/System.err:     at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
03-31 14:30:15.584 21164-21484/mycompany.app W/System.err:     at java.lang.Thread.run(Thread.java:818)

代码:

public class ChatMessagesActivity extends ApplicationDrawerLoader {

  @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat_messages);
 sendMessageButton = (Button) findViewById(R.id.sendMessageButton);
        typeMessageField = (EditText) findViewById(R.id.sendMessageTextField);
        typeMessageField.setHint("Type message here...");
  sendMessageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
 Map<String, Object> outputData = new HashMap<>();
                    outputData.put("text", typeMessageField.getText().toString());
                    outputData.put("timestamp", new Timestamp(System.currentTimeMillis()));
                    outputData.put("type", false);
                    outputData.put("name",StaticRestTemplate.firstName);
                    consoleChatClient.bayeuxClient.getChannel("/service/person/" + String.valueOf(conversationId)).publish(outputData);
}

    public void recieveUpdatedMessage(String channelName, Map<String, Object> input) {
HashMap<String, String> insertMap = new HashMap<>();
                insertMap.put(chatText, ((Map) input.get("data")).get("text").toString());
                insertMap.put(firstName, ((Map) input.get("data")).get("firstname").toString());
 chatMessagesAdapter.add(insertMap);
                chatMessagesAdapter.notifyDataSetChanged();
                chatList.scrollTo(0, chatList.getHeight());
}
 public class getGroupChatsForUser extends AsyncTask<Void, Void, ResponseEntity<RestChatMessages[]>> {
        ChatMessagesActivity chatMessagesActivity = null;
        getGroupChatsForUser(ChatMessagesActivity chatMessagesActivity) {
            this.chatMessagesActivity = chatMessagesActivity;
        }
 @Override
        protected void onPostExecute(ResponseEntity<RestChatMessages[]> responseEntity) {
            super.onPostExecute(responseEntity);
 chatList = (ListView) findViewById(R.id.chatList);
            chatMessagesAdapter = new ChatMessagesAdapter(chatMessagesActivity, chatMessagesHashMapList);

            chatList.setAdapter(chatMessagesAdapter);
            chatList.scrollTo(0, chatList.getHeight()); 
      }
   }
 public class ChatListener implements ClientSessionChannel.MessageListener {
        public void onMessage(ClientSessionChannel channel, Message message) {
            try {
                JSONObject jsonObject = new JSONObject(message).getJSONObject("data");
                String result = jsonObject.getString("type");
                if (result.equals("false")) {
                    recieveUpdatedMessage(channel.toString(), message);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }
}

如果粘贴所有stacktrace会容易得多,但我假设您不是从主线程更改视图。

在调用对视图执行操作的方法时使用此选项:

activity.runOnUiThread(new Runnable() {
    public void run() {
        methodThatIsDoingViewStuff();
    }
});

最新更新