Uppdatera TextView när låten byts?

Diskussion i 'Frågor, support och diskussion' startad av Pajn, 20 dec 2011.

  1. Pajn

    Pajn Adult Droid Medlem

    Blev medlem:
    12 aug 2009
    Inlägg:
    606
    Mottagna gillanden:
    51

    MINA ENHETER

    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.
     
  2. ozp

    ozp Teen Droid Medlem

    Blev medlem:
    6 maj 2010
    Inlägg:
    250
    Mottagna gillanden:
    31

    MINA ENHETER

    Du får bara uppdatera ui:t från ui-tråden.

    Gör så här:
    Kod:
    runOnUiThread(new Runnable() {
    
          public void run() {
                // Din kod här
          }
    });
     
    Pajn gillar detta.
  3. Pajn

    Pajn Adult Droid Medlem

    Blev medlem:
    12 aug 2009
    Inlägg:
    606
    Mottagna gillanden:
    51

    MINA ENHETER

    Jo jag förstod det. Men jag trodde att jag gjorde det...

    Aja. Det fungerade jättebra. Tack!