onCreate()วิธีการของคุณมีข้อบกพร่องมากมาย:
1) onCreate เตรียมกิจกรรมของคุณ - ดังนั้นผู้ใช้จะมองไม่เห็นสิ่งใดที่คุณทำที่นี่จนกว่าวิธีนี้จะเสร็จสิ้น! ตัวอย่างเช่นคุณจะไม่สามารถแก้ไขTextViewข้อความที่นี่ได้มากกว่าหนึ่งครั้งเนื่องจากการเปลี่ยนแปลงสุดท้ายเท่านั้นที่จะถูกดึงออกมาและทำให้ผู้ใช้มองเห็นได้!
2) โปรดทราบว่าโปรแกรม Android จะ - โดยเริ่มต้น - ทำงานในหนึ่งกระทู้เท่านั้น! ดังนั้น: ห้ามใช้Thread.sleep()หรือThread.wait()ในเธรดหลักของคุณซึ่งรับผิดชอบ UI ของคุณ! (อ่าน"ให้แอปของคุณตอบสนองต่อ"สำหรับข้อมูลเพิ่มเติม!)
การเริ่มต้นกิจกรรมของคุณคืออะไร:
- คุณสร้าง
TextViewวัตถุใหม่โดยไม่มีเหตุผลt!
- คุณเลือกเค้าโครงของคุณ
TextViewในตัวแปรในtภายหลัง
- คุณตั้งค่าข้อความของ
t(แต่โปรดจำไว้ว่ามันจะปรากฏขึ้นหลังจาก onCreate()เสร็จสิ้นและลูปเหตุการณ์หลักของแอปพลิเคชันของคุณจะทำงาน!)
- คุณรอ10 วินาทีภายใน
onCreateวิธีการของคุณ- สิ่งนี้จะต้องไม่เกิดขึ้นเนื่องจากหยุดกิจกรรม UI ทั้งหมดและจะบังคับ ANR อย่างแน่นอน (แอปพลิเคชันไม่ตอบสนองดูลิงก์ด้านบน!)
- จากนั้นคุณตั้งค่าข้อความอื่น - ข้อความนี้จะแสดงทันทีที่
onCreate()วิธีการของคุณเสร็จสิ้นและวิธีการอื่น ๆ ของวงจรชีวิตของกิจกรรมได้รับการประมวลผล!
การแก้ไขปัญหา:
ตั้งค่าข้อความเพียงครั้งเดียวonCreate()- ต้องเป็นข้อความแรกที่ควรมองเห็นได้
สร้างRunnableและHandler
private final Runnable mUpdateUITimerTask = new Runnable() {
public void run() {
t.setText("Second text to display!");
}
};
private final Handler mHandler = new Handler();
ติดตั้ง runnable นี้เป็นตัวจัดการที่เป็นไปได้ในonCreate()(แต่อ่านคำแนะนำของฉันด้านล่าง):
mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);
คำแนะนำ: ต้องแน่ใจว่าคุณรู้จักActivityวงจรชีวิต! หากคุณทำสิ่งonCreate()นี้ในสิ่งนี้จะเกิดขึ้นเมื่อคุณActivityสร้างครั้งแรกเท่านั้น! Android อาจทำให้คุณActivityมีชีวิตอยู่ได้นานขึ้นแม้ว่าจะมองไม่เห็นก็ตาม! เมื่อผู้ใช้ "เริ่ม" อีกครั้ง - และยังคงมีอยู่คุณจะไม่เห็นข้อความแรกของคุณอีกต่อไป!
=> ติดตั้งตัวจัดการเสมอonResume()และปิดการใช้งานในonPause()! มิฉะนั้นคุณจะได้รับ "การอัปเดต" เมื่อคุณActivityมองไม่เห็นเลย! ในกรณีของคุณหากคุณต้องการเห็นข้อความแรกของคุณอีกครั้งเมื่อเปิดใช้งานอีกครั้งคุณต้องตั้งค่าonResume()ไม่ใช่onCreate()!
.setText()แทนที่ "วิดเจ็ต" ทั้งหมดด้วยข้อความที่คุณบอกให้ตั้งค่า รวมถึงข้อความที่คุณได้ใส่ไว้แล้ว