2016-03-31 3 views
1

Ich arbeite an einem Android-Projekt, in dem ich an Chat-Funktionalität arbeite. Immer wenn eine neue Nachricht empfangen wird, muss ich (buchstäblich) den Bildschirm berühren, dann kann nur die neue Nachricht gesehen werden. Zum ersten Mal bekomme ich den unten genannten Fehler. Wie kann ich das Objekt zu einer bereits vorhandenen Liste hinzufügen? Jede Hilfe wäre nett. Vielen Dank.Android: Objekt kann nicht zu einer vorhandenen Liste hinzugefügt werden, da es nicht ursprünglicher Thread ist

Ich bekomme die letzte Nachricht in ChatListener, die dann an eine Methode weitergeleitet wird, die willy, um es dem Adapter hinzuzufügen.

Entire Stacktrace:

03-31 14:30:15.578 21164-21484/mycompany.app W/System.err: Handhskare complete[[email protected]] INFO org.cometd.bayeux.client.ClientSession - Exception while invoking listener [email protected] 
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) 

Code:

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(); 
      } 
     } 
    } 

} 
+0

Dies ist die komplette Code in Pastebin für die Anzeige: http://pastebin.com/PaRhtDJN –

Antwort

1

Es wird viel einfacher, wenn Sie alle Stacktrace einfügen würde, aber ich gehe davon aus, dass Sie den Blick nicht vom Hauptthread ändern.

verwenden, wenn Methoden aufrufen, die etwas mit Blick tun:

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

Bereits diese Änderung vorgenommen hat, ohne bewirken. Es macht tatsächlich die alten Chat-Nachrichten auch unsichtbar. –

+0

bitte kopieren Sie alle Stack-Trace – pjanecze

+0

Mit dem RunOnUIThread gibt es keinen Fehler. Ich werde es entfernen und erneut ausführen und dann das Protokoll einfügen. Gib mir 2 Minuten. –

Verwandte Themen