Teks Android TextView tidak diperbarui selama runtime

Saya pasti melewatkan sesuatu yang sangat bodoh dalam hal ini karena memperbarui TextView seharusnya menjadi tugas yang mudah. Saya memiliki kelas Aktivitas yang merupakan pengamat kelas lain yang menerima pesan. Di onCreate Aktivitas saya, saya melakukan hal berikut dan berfungsi dengan baik.

theStatus = (TextView) findViewById(R.id.theStatus);
theStatus.setText("waiting");

Nanti ketika aktivitas pesan menerima pesan baru, aktivitas tersebut menyerahkannya kepada pengamatnya (Aktivitas saya)

public void statusUpdate( GenericMessage aMessage )
{
    String statusText = aMessage.getDetails();
    theStatus.setText(statusText);

    theSessionStatus.invalidate();  // I've tried with and without this call
}

Namun layarnya tidak diperbarui. Aku pasti mengabaikan sesuatu...


person bursk    schedule 03.09.2010    source sumber
comment
Apakah Anda yakin statusUpdate() bahkan dipanggil?   -  person CommonsWare    schedule 04.09.2010
comment
Saya yakin statusUpdate dipanggil. Saya menggunakan debugger dan menangkap breakpoint yang telah saya tetapkan di sana. Satu detail yang kini saya sadari mungkin memengaruhi saya adalah bahwa Aktivitas ini bukanlah aktivitas utama aplikasi. Singkat cerita adalah aplikasi utama dimulai dan menunggu pengguna mengklik tombol untuk memulai. Setelah dimulai, ia memulai rangkaian pesan dan berdasarkan pesan darinya ia memutuskan Aktivitas apa yang akan ditampilkan kepada pengguna. Aktivitas ini dimulai dengan memanggil startActivityForResult dan Aktivitas kemudian mendaftarkan dirinya sebagai pengamat rangkaian pesan.   -  person bursk    schedule 04.09.2010
comment
Anda harus memastikan bahwa aktivitas yang sedang berlangsung menangani panggilan statusUpdate().   -  person Karan    schedule 04.09.2010
comment
Saya telah memastikan bahwa statuUpdate() dipanggil. Seperti yang saya nyatakan dalam komentar saya sebelumnya, saya masuk dengan debugger. Saya dapat melangkahi panggilan setText dan melihat teks di properti variabel, tetapi layar tidak diperbarui.   -  person bursk    schedule 04.09.2010
comment
Saya kira maksud Karan adalah statusUpdate harus dipanggil di thread UI. Sudahkah Anda mencoba memperbarui TextView dari aktivitas utama Anda?   -  person Asahi    schedule 04.09.2010
comment
Saya pikir itu berada di jalur yang benar. Saya sekarang melihat pengecualian dikeluarkan ketika saya memanggil setText Hanya utas asli yang membuat hierarki tampilan yang dapat menyentuh pandangannya. Kurasa aku bingung. Tidak bisakah suatu Aktivitas memulai Aktivitas lain menggunakan startActivityByResult dan kemudian membiarkan kelas Aktivitas baru menangani pembaruannya sendiri? Aktivitas A memulai Aktivitas B. Saya tidak ingin A mengetahui tentang widget di layar B. Hal itu sepertinya mematahkan keseluruhan gagasan pemrograman OO. Saya sangat menghargai bantuannya. Sangat membuat frustrasi.   -  person bursk    schedule 04.09.2010


Jawaban (1)


Sepertinya saya menemukan solusinya, meski terasa seperti peretasan. Saya mendapat ide dari komentar Anda di atas dan dari di sini.

Saya sekarang menggunakan Handler untuk memberi tahu Aktivitas B bahwa ada pesan masuk yang diminatinya. B membuat Handler di onCreate-nya:

  Handler statusHandler = new Handler();
  statusHandler.post(new Runnable() 
  {
      public void run()
      {
         statusUpdate();
      }
  });

Saya memperbarui penerima pesan kelas C (yang B coba menjadi Pengamatnya) untuk menerima Pegangan ketika B mendaftar dengannya. Kemudian di C, saya memanggil yang berikut ini ketika pesan yang berlaku masuk:

theMsgObserverHandle.post(new Runnable()
{
   public void run()
   {
      Log.d(myName, "Calling my Observer statusUpdate");  

      theMsgObserver.statusUpdate();
   }
});

Yang tidak aku suka adalah sekarang aku tidak bisa begitu saja menyampaikan pesanku pada B secara langsung. (Kelas pesan saya adalah kelas yang saya tentukan sendiri, bukan Android.os.Message) Sebaliknya sekarang di B saya perlu menanyakan instance C (C adalah Singleton) untuk pesan tersebut. Tapi setidaknya aku bergerak maju. Jika ada yang memiliki implementasi yang lebih baik, saya akan sangat menghargai masukannya.

person bursk    schedule 04.09.2010
comment
Aneh, saat membaca lebih lanjut sepertinya saya tidak perlu memanggil statusHandler.post pertama yang saya miliki di onCreate saya, tetapi jika saya mengeluarkannya, saat statusUpdate dipanggil dan tidak lagi mengeluarkan pengecualian, setText tidak berfungsi. - person bursk; 04.09.2010