ข้อความ Android TextView ไม่ได้อัปเดตระหว่างรันไทม์

ฉันต้องพลาดสิ่งที่โง่เขลาไปอย่างสิ้นเชิงในสิ่งนี้เนื่องจากการอัปเดต TextView ควรเป็นเรื่องง่าย ฉันมีคลาสกิจกรรมที่เป็นผู้สังเกตการณ์ของอีกคนหนึ่งที่ได้รับข้อความ ใน onCreate กิจกรรมของฉัน ฉันทำสิ่งต่อไปนี้และทำงานได้ดี

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

ต่อมาเมื่อกิจกรรมข้อความได้รับข้อความใหม่ มันจะส่งต่อไปยังผู้สังเกตการณ์ (กิจกรรมของฉัน)

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

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

แต่หน้าจอไม่อัพเดท ฉันคงจะมองข้ามอะไรบางอย่างไป...


person bursk    schedule 03.09.2010    source แหล่งที่มา
comment
คุณแน่ใจหรือว่า statusUpdate() กำลังถูกเรียกอยู่?   -  person CommonsWare    schedule 04.09.2010
comment
ฉันแน่ใจว่ามีการเรียก statusUpdate ฉันกำลังใช้ดีบักเกอร์และตรวจจับเบรกพอยต์ที่ฉันตั้งค่าไว้ รายละเอียดอย่างหนึ่งที่ฉันรู้ว่าอาจส่งผลต่อฉันก็คือกิจกรรมนี้ไม่ใช่กิจกรรมหลักของแอป เรื่องสั้นคือแอปหลักเริ่มทำงานและรอให้ผู้ใช้คลิกปุ่มเพื่อเริ่ม เมื่อเริ่มต้นแล้ว จะเริ่มเธรดข้อความและขึ้นอยู่กับข้อความจากนั้นจะตัดสินใจว่ากิจกรรมใดที่จะแสดงต่อผู้ใช้ มันเริ่มกิจกรรมนี้โดยการเรียก startActivityForResult จากนั้นกิจกรรมจะลงทะเบียนตัวเองเป็นผู้สังเกตการณ์ของเธรดข้อความ   -  person bursk    schedule 04.09.2010
comment
คุณควรตรวจสอบให้แน่ใจว่ากิจกรรมที่กำลังดำเนินอยู่นั้นรองรับการเรียก statusUpdate()   -  person Karan    schedule 04.09.2010
comment
ฉันแน่ใจว่ากำลังเรียก statuUpdate() อย่างที่ฉันระบุไว้ในความคิดเห็นก่อนหน้าของฉัน ฉันกำลังก้าวเข้าสู่โปรแกรมดีบักเกอร์ ฉันสามารถข้ามการเรียก setText และดูข้อความในคุณสมบัติของตัวแปรได้ แต่หน้าจอไม่อัปเดต   -  person bursk    schedule 04.09.2010
comment
ฉันเดาว่า Karan หมายถึงอะไรคือควรเรียก statusUpdate บนเธรด UI คุณได้ลองอัปเดต TextView จากกิจกรรมหลักของคุณแล้วหรือยัง?   -  person Asahi    schedule 04.09.2010
comment
ฉันคิดว่านั่นมาถูกทางแล้ว ตอนนี้ฉันเห็นข้อยกเว้นถูกเตะออกเมื่อฉันเรียก setText เฉพาะเธรดดั้งเดิมที่สร้างลำดับชั้นการดูเท่านั้นที่สามารถสัมผัสมุมมองได้ ฉันเดาว่าฉันสับสน กิจกรรมไม่สามารถเริ่มต้นกิจกรรมอื่นโดยใช้ startActivityByResult แล้วปล่อยให้คลาสของกิจกรรมใหม่จัดการการอัปเดตของตัวเองได้หรือไม่ กิจกรรม A เริ่มต้นกิจกรรม B ฉันไม่ต้องการให้ A ต้องรู้เกี่ยวกับวิดเจ็ตบนหน้าจอของ B นั่นดูเหมือนจะทำลายแนวคิดทั้งหมดของการเขียนโปรแกรม OO ฉันซาบซึ้งกับความช่วยเหลือจริงๆ น่าหงุดหงิดมาก   -  person bursk    schedule 04.09.2010


คำตอบ (1)


ดูเหมือนว่าฉันจะพบวิธีแก้ปัญหาแล้ว แม้ว่าจะรู้สึกเหมือนเป็นการแฮ็กก็ตาม ฉันได้รับแนวคิดนี้จากความคิดเห็นของคุณด้านบนและจากที่นี่

ตอนนี้ฉันกำลังใช้ตัวจัดการเพื่อแจ้งกิจกรรม B ว่ามีข้อความเข้ามาว่าสนใจ B สร้างตัวจัดการใน onCreate:

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

ฉันอัปเดตตัวรับข้อความคลาส C (ที่ B พยายามเป็นผู้สังเกตการณ์) เพื่อดำเนินการเมื่อ B ลงทะเบียนด้วย จากนั้นใน C ฉันเรียกสิ่งต่อไปนี้เมื่อมีข้อความที่เกี่ยวข้องเข้ามา:

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

      theMsgObserver.statusUpdate();
   }
});

สิ่งที่ฉันไม่ชอบคือตอนนี้ฉันไม่สามารถส่งข้อความถึงบีโดยตรงได้ (คลาสข้อความของฉันเป็นคลาสที่ฉันกำหนดเองไม่ใช่ android.os.Message) ตอนนี้ใน B ฉันต้องถามอินสแตนซ์ของ C (C คือซิงเกิลตัน) สำหรับข้อความ แต่อย่างน้อยฉันก็ได้ก้าวไปข้างหน้า หากใครมีการนำไปปฏิบัติที่ดีกว่านี้ ฉันยินดีเป็นอย่างยิ่งกับคำติชม

person bursk    schedule 04.09.2010
comment
น่าแปลกที่เมื่ออ่านเพิ่มเติม ดูเหมือนว่าฉันไม่ควรต้องเรียก statusHandler.post แรกที่ฉันมีใน onCreate ของฉัน แต่ถ้าฉันเอามันออกไป ในขณะที่ statusUpdate ถูกเรียกและไม่ส่งข้อยกเว้นอีกต่อไป setText จะไม่ทำงาน - person bursk; 04.09.2010