SORU
2 Mart 2011, ÇARŞAMBA


Android "bu hiyerarşi görüşlerini dokunamaz bir görünüm yarattı. özgün iş parçacığı ve Sadece"

Android basit bir müzik çalar inşa ettik. Her şarkı için bir görünüm SeekBar, bu gibi uygulanan içerir:

public class Song extends Activity implements OnClickListener,Runnable {
private SeekBar progress;
private MediaPlayer mp;

// ...

private ServiceConnection onService = new ServiceConnection() {
      public void onServiceConnected(ComponentName className,
        IBinder rawBinder) {
          appService = ((MPService.LocalBinder)rawBinder).getService(); // service that handles the MediaPlayer
          progress.setVisibility(SeekBar.VISIBLE);
          progress.setProgress(0);
          mp = appService.getMP();
          appService.playSong(title);
          progress.setMax(mp.getDuration());
          new Thread(Song.this).start();
      }
      public void onServiceDisconnected(ComponentName classname) {
          appService = null;
      }
};

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.song);

    // ...

    progress = (SeekBar) findViewById(R.id.progress);

    // ...
}

public void run() {
int pos = 0;
int total = mp.getDuration();
while (mp != null && pos<total) {
    try {
        Thread.sleep(1000);
        pos = appService.getSongPosition();
    } catch (InterruptedException e) {
        return;
    } catch (Exception e) {
        return;
    }
    progress.setProgress(pos);

}
}

Bu gayet iyi çalışıyor. Şimdi bir zamanlayıcı şarkının ilerleme Dakika/Saniye sayma istiyorum. Düzen içerisinde bir TextView koydum, findViewByİd ile almak() onCreate () ve çalıştır koy() ilerleme sonra.setProgress(pos):

String time = String.format("%d:%d",
            TimeUnit.MILLISECONDS.toMinutes(pos),
            TimeUnit.MILLISECONDS.toSeconds(pos),
            TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(
                    pos))
            );
currentTime.setText(time);  // currentTime = (TextView) findViewById(R.id.current_time);

Ama o son cümle beni istisna verir:

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Henüz temelde SeekBar ile onCreate görünümü oluşturma yaptığım gibi burada da aynı şeyi yapıyor, sonra vadede dokunuyorum ve beni bu şikayet vermez. Yani bariz bir hata burada mı? Hem Android ve Java yeniyim, eğer aptalca bir şey olursa hiç şaşırmam yani.

CEVAP
2 Mart 2011, ÇARŞAMBA


Ana konu üzerine uı güncelleştirmeleri arka planda görev bölümünü taşımak zorunda. Bu kodu basit bir parça var:

runOnUiThread(new Runnable() {
     @Override
     public void run() {

//stuff that updates ui

    }
});

Activity.runOnUiThread belgeleri

Sadece arka planda çalışan bir yöntem içinde bu yuva, sonra kopya bloğun ortasında herhangi bir güncelleme uygulayan kodu yapıştırın. Kodu mümkün olan en düşük miktarda vardır, aksi takdirde arka plan iş parçacığı amacı yenmek için başlar.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AFISHAL

    AFISHAL

    7 Mart 2009
  • EminemMusic

    EminemMusic

    9 ŞUBAT 2007
  • iZAPPA

    iZAPPA

    16 Temmuz 2010