Jag håller på med en musikspelare.
Musiken spelas genom en service som ligger i en annan tråd (":remote" är satt)
För att snacka mellan UI:t och Servicen använder jag självklart AIDL.
Jag uppdaterar TextView:n i updateSong() som jag kallar från en AIDL funktion:
Kod:
private ChangeListener.Stub collectorListener = new ChangeListener.Stub() {
@Override
public void update() throws RemoteException {
updateSong();
}
};
Detta funkar jättebra när jag byter låt med knapparna i UI:t men inte när en låt tar slut, utan då får jag:
Kod:
12-20 17:17:46.673: E/JavaBinder(651): *** Uncaught remote exception! (Exceptions are not yet supported across processes.)
12-20 17:17:46.673: E/JavaBinder(651): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
12-20 17:17:46.673: E/JavaBinder(651): at android.view.ViewRoot.checkThread(ViewRoot.java:2683)
12-20 17:17:46.673: E/JavaBinder(651): at android.view.ViewRoot.requestLayout(ViewRoot.java:557)
12-20 17:17:46.673: E/JavaBinder(651): at android.view.View.requestLayout(View.java:7918)
12-20 17:17:46.673: E/JavaBinder(651): at android.view.View.requestLayout(View.java:7918)
12-20 17:17:46.673: E/JavaBinder(651): at android.view.View.requestLayout(View.java:7918)
12-20 17:17:46.673: E/JavaBinder(651): at android.view.View.requestLayout(View.java:7918)
12-20 17:17:46.673: E/JavaBinder(651): at android.view.View.requestLayout(View.java:7918)
12-20 17:17:46.673: E/JavaBinder(651): at android.view.View.requestLayout(View.java:7918)
12-20 17:17:46.673: E/JavaBinder(651): at android.view.View.requestLayout(View.java:7918)
12-20 17:17:46.673: E/JavaBinder(651): at android.view.View.requestLayout(View.java:7918)
12-20 17:17:46.673: E/JavaBinder(651): at android.view.View.requestLayout(View.java:7918)
12-20 17:17:46.673: E/JavaBinder(651): at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:255)
12-20 17:17:46.673: E/JavaBinder(651): at android.view.View.requestLayout(View.java:7918)
12-20 17:17:46.673: E/JavaBinder(651): at android.view.View.requestLayout(View.java:7918)
12-20 17:17:46.673: E/JavaBinder(651): at android.widget.TextView.checkForRelayout(TextView.java:5380)
12-20 17:17:46.673: E/JavaBinder(651): at android.widget.TextView.setText(TextView.java:2684)
12-20 17:17:46.673: E/JavaBinder(651): at android.widget.TextView.setText(TextView.java:2552)
12-20 17:17:46.673: E/JavaBinder(651): at android.widget.TextView.setText(TextView.java:2527)
12-20 17:17:46.673: E/JavaBinder(651): at com.pajn.canto.Player.updateSong(Player.java:92)
12-20 17:17:46.673: E/JavaBinder(651): at com.pajn.canto.Player$2.update(Player.java:134)
12-20 17:17:46.673: E/JavaBinder(651): at com.pajn.canto.ChangeListener$Stub.onTransact(ChangeListener.java:48)
12-20 17:17:46.673: E/JavaBinder(651): at android.os.Binder.execTransact(Binder.java:287)
12-20 17:17:46.673: E/JavaBinder(651): at dalvik.system.NativeStart.run(Native Method)
I servicen hanteras det på samma sätt:
Kod:
synchronized (listeners) {
for (ChangeListener listener : listeners) {
try {
listener.update();
} catch (RemoteException e) {
Log.w(TAG, "Failed to notify listener " + listener, e);
}
}
}
i playSong(int). När en låt ändras med knapparna kallas nextSong() eller prevSong() från AIDL som plockar fram nästa låt i kön och kallar playSong(int). När låten är slut kallas nextSong() istället från en listener.