ความแตกต่างระหว่างActivity.runOnUiThreadและView.postใครช่วยอธิบายได้ไหม
ความแตกต่างระหว่างActivity.runOnUiThreadและView.postใครช่วยอธิบายได้ไหม
คำตอบ:
ไม่มีความแตกต่างที่แท้จริงยกเว้นว่าView.postจะมีประโยชน์เมื่อคุณไม่มีสิทธิ์เข้าถึงกิจกรรมโดยตรง
ในทั้งสองกรณีหากไม่อยู่ในเธรด UI Handler#post(Runnable)จะถูกเรียกอยู่เบื้องหลัง
ตามที่ CommonsWare กล่าวไว้ในความคิดเห็นมีความแตกต่างระหว่างสอง - เมื่อเรียกบน Ui thread Activity#runOnUiThreadจะเรียกใช้runเมธอดโดยตรงในขณะที่View#postจะโพสต์runnableบนคิว (เช่นเรียกHandler#post)
ประเด็นสำคัญ IMO คือทั้งสองมีเป้าหมายเดียวกันและสำหรับใครก็ตามที่ใช้มันไม่ควรมีความแตกต่างกัน (และการนำไปใช้งานอาจมีการเปลี่ยนแปลงในอนาคต)
runOnUiThread()ตรวจสอบเธรดปัจจุบันและดำเนินการRunnableทันทีว่าเราอยู่บนเธรดแอปพลิเคชันหลักหรือไม่ post()วางRunnableคิวไว้เสมอไม่ว่าจะเรียกใช้เธรดใดก็ตาม
runOnUiThread()ตรวจสอบเธรดปัจจุบันและดำเนินการRunnableทันทีหากเราอยู่ในเธรดแอปพลิเคชันหลัก " (เพิ่มการเน้นย้ำ) "หมายความว่าสิ่งที่เคยอยู่ในเธรด UI ถูกละเว้นและสิ่งนี้ให้ความสำคัญเป็นอันดับแรกหรือไม่" - "สิ่งที่เคยอยู่ในเธรด UI" คือการrunOnUiThread()โทร
ความแตกต่างอีกประการระหว่าง Activity.runOnUiThread และ view.post () คือ runnable ใน view.post () ถูกเรียกใช้หลังจากที่มุมมองแนบกับหน้าต่าง
ยอมรับได้ในสถานการณ์ส่วนใหญ่และส่วนใหญ่สามารถใช้แทนกันได้ แต่จะแตกต่างกันอย่างละเอียด ความแตกต่างที่ใหญ่ที่สุดแน่นอนคือสิ่งหนึ่งที่มีให้จากActivityและอีกอันหนึ่งจากไฟล์View. มีการทับซ้อนกันมากมาย แต่บางครั้งActivityคุณจะไม่สามารถเข้าถึงไฟล์ a Viewและบางครั้งViewคุณจะไม่สามารถเข้าถึงActivityไฟล์.
หนึ่งในกรณีขอบที่ฉันเคยพบกับView.postฉันได้กล่าวถึงในคำตอบของคำถาม SO อื่นบนView.post : View.postใช้งานได้จากเธรดอื่นเมื่อViewแนบกับหน้าต่างเท่านั้น นี่คือไม่ค่อยมีปัญหา แต่บางครั้งอาจทำให้เกิดRunnableการไม่ดำเนินการโดยเฉพาะอย่างยิ่งถ้าคุณโทรView.postในวิธีการของคุณonCreate Activityอีกทางเลือกหนึ่งคือการใช้Handler.postสิ่งที่เป็นสิ่งที่Activity.runOnUiThreadและView.postใช้ภายใต้ฝาครอบอยู่ดี
(แก้ไขเพื่อความถูกต้องเพิ่ม "จากชุดข้อความอื่น")
onCreate()ด้วย? อืมฉันคาดหวังว่ามันจะโพสต์ไปยังที่Handlerให้มาViewRootในกรณีนั้น
View.postควรเพิ่มในRunnableคิวเพื่อดำเนินการในภายหลังหากยังไม่ได้แนบ ฉันไม่ได้ขุดลึกลงไปในแหล่งที่มามากนัก แต่เอกสารบอกว่า: "วิธีนี้สามารถเรียกใช้จากนอกเธรด UI ได้ก็ต่อเมื่อมุมมองนี้แนบกับหน้าต่างเท่านั้น" ดังนั้นฉันคิดว่าถ้ามันอยู่ในเธรดปัจจุบันสิ่งที่คุณพูดเป็นความจริงถ้าไม่ใช่มันก็อาจจะกลืนกินไฟล์Runnable. ฉันเคยมีสิ่งนั้นเกิดขึ้นในรหัสของฉันอย่างแน่นอน
ความแตกต่างอีกประการหนึ่งpostคือต่อการดู; runOnUiThreadเป็นต่อกิจกรรม
ซึ่งหมายความว่าจะเป็นไปได้ (ในอนาคต?) ที่จะทำview.getQueue/ activity.getQueueและได้รับสิ่งที่คุณต้องการโดยไม่ต้องมีโค้ดติดตามหรือตัวกรองของคุณเอง