2016-05-27 8 views
0

In meiner Hauptaktivität verwende ich einen Ansichtspager, der zwei Fragmente anzeigt. Eine für die letzten Nachrichten und weitere Online-Kontakte. In meinem Kontaktfragment verbinde ich Aktivitäten mit einem Dienst namens ContactService. ContactService verfügt über eine Schnittstelle FragmentConnected die eine öffentliche Methode wie folgt hat:Aufruf der ViewPager-Fragmentmethode vom Dienst: Nur der ursprüngliche Thread, der eine Ansichtshierarchie erstellt hat, kann seine Ansichten berühren

Schnittstelle FragmentConnected {

 public void onFragmentConnected(ArrayList<Contact> clist); 

}

In meinem ContactFragment ich bin der Umsetzung dieser Schnittstelle wie diese

public void onFragmentConnected (ArrayList clist) {

     onlineContactAdapter.changeList(clist); 
      } 

Hier onlineContactAdapter ist mein Adpter für ContactFragment hat eine Methode changeList zum Aktualisieren der Liste der Online-Benutzer.

In meinem Service ContactService in onHandleIntent erhalte ich eine Liste von Online-Benutzern vom Server und ich rufe Methode contactFragment.onFragmentConnected auf, da ich eine Instanz von ContactFragment in contactFragment habe, wenn es an den Dienst bindet. EveryThing läuft gut, bis ich diese Methode onFragmentConnected aus dem Dienst aufrufen. Wenn ich diese Methode vom Dienst ausrufe, gibt es mir diesen Fehler: - android.view.ViewRootImpl $ CalledFromWrongThreadException: Nur der ursprüngliche Thread, der eine Ansichtshierarchie erstellt hat, kann seine Ansichten berühren.

+0

Ihr Dienst ruft Ihren Rückruf von einem anderen Thread als den Hauptthread ... scheint es. Daher wird der Rückruf Ihres Aktivitätsdienstes in einem Hintergrundthread aufgerufen, der dieses Problem verursacht. Ich würde empfehlen, dass Sie Ihren Service-Rückruf vom Hauptthread aufrufen. – Jona

+0

Aber ich muss Online-Kontaktliste vom Dienst aktualisieren, wie kann ich diese Methode von Service als UI MainThread aufrufen? Gibt es irgendeine Methode? – abc

+0

Ich bin mir nicht sicher, wie Sie Ihren ContactService implementiert haben. Aber Ihre Daten ziehen von einem Server auf einem Hintergrundthread. Nachdem Sie diese Daten erhalten haben, senden Sie Ihre Updates über den Hauptthread. Es gibt viele Möglichkeiten, wie Sie das tun können. Am einfachsten mit Handler. http://stackoverflow.com/questions/11123621/running-code-in-main-thread-from-another-thread – Jona

Antwort

0

Ich weiß nicht genau, wie Sie Ihren ContactService implementiert haben. Aber Ihre Daten ziehen von einem Server auf einem Hintergrundthread. Nachdem Sie diese Daten erhalten haben, müssen Sie diese veröffentlichen, um Ihre Updates über den Hauptthread zu senden. Es gibt viele Möglichkeiten, wie Sie das tun können.

Am einfachsten mit Handler. Running code in main thread from another thread