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