【问题标题】:Android : Object cannot be added to an existing List as its not original threadAndroid:无法将对象添加到现有列表中,因为它不是原始线程
【发布时间】:2016-03-31 11:25:14
【问题描述】:

我正在开发一个 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();
            }
        }
    }

}

【问题讨论】:

标签: android thread-safety chat


【解决方案1】:

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

在调用对视图做某事的方法时使用它:

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

【讨论】:

  • 已经进行了更改,没有任何效果。它实际上使旧的聊天消息也变得不可见。
  • 请复制粘贴所有堆栈跟踪
  • 使用runOnUIThread,没有错误。我将删除它并再次运行,然后粘贴日志。给我 2 分钟。
  • 编辑了主帖以包含整个堆栈跟踪。请检查一下。谢谢你。 :-)
  • 删除 chatList.scrollTo(0, chatList.getHeight());解决了问题.. :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2013-01-14
相关资源
最近更新 更多