วิธีตรวจหาเธรด UI บน Android


117

มีวิธีที่มีประสิทธิภาพในการตรวจสอบว่าThread.currentThread()เธรด UI ของระบบ Android อยู่ในแอปพลิเคชันหรือไม่
ฉันต้องการใส่คำยืนยันในรหัสรุ่นของฉันที่ยืนยันว่ามีเพียงเธรดเดียว ( เช่นเธรด ui) เท่านั้นที่เข้าถึงสถานะของฉันเพื่อให้มั่นใจว่าไม่จำเป็นต้องมีการซิงโครไนซ์ประเภทใด


ดูคำตอบของฉันที่นี่: stackoverflow.com/a/41280460/878126
นักพัฒนา Android

คำตอบ:


199

แนวทางปฏิบัติทั่วไปในการกำหนดเอกลักษณ์ของเธรด UI คือผ่านLooper # getMainLooper :

if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
  // On UI thread.
} else {
  // Not on UI thread.
}

ตั้งแต่ API ระดับ 23 ขึ้นไปมีแนวทางที่อ่านได้ง่ายขึ้นเล็กน้อยโดยใช้วิธีการช่วยเหลือใหม่isCurrentThreadบนลูปเปอร์หลัก:

if (Looper.getMainLooper().isCurrentThread()) {
  // On UI thread.
} else {
  // Not on UI thread.
}

6
stackoverflow.com/questions/11411022/… คำตอบนี้ก็ดีเหมือนกัน)
UnknownJoe

44

ฉันคิดว่าวิธีที่ดีที่สุดคือ:

 if (Looper.getMainLooper().equals(Looper.myLooper())) {
     // UI thread
 } else {
     // Non UI thread
 }

ใช้งานได้ดี ขอบคุณ!
Hong

3
ไม่จำเป็นต้องใช้equalsเนื่องจากเราเปรียบเทียบการอ้างอิงเท่านั้นและยิ่งไปกว่านั้นทั้งสองแบบคงที่
mr5

8

ในฐานะของ API ระดับ 23 มีวิธีการช่วยเหลือที่ดีLooper isCurrentThreadคุณสามารถรับmainLooperและดูว่าเป็นเธรดปัจจุบันหรือไม่ด้วยวิธีนี้:

Looper.getMainLooper().isCurrentThread()

แทบจะเหมือนกับ:

Looper.getMainLooper().getThread() == Thread.currentThread()

แต่อาจจะอ่านง่ายกว่าและจำง่ายกว่า



2

นอกจากการตรวจสอบlooperแล้วหากคุณเคยพยายามล็อกเอาต์ id เธรดในonCreate()คุณจะพบว่าid เธรด UI (เธรดหลัก)จะเท่ากับ 1 เสมอดังนั้น

if (Thread.currentThread().getId() == 1) {
    // UI thread
}
else {
    // other thread
}

ฉันไม่พบเอกสารที่เป็นทางการใด ๆ ที่ยืนยันว่าเป็นความจริงและจะเป็นเช่นนั้นเสมอไป คุณมีลิงค์หรือไม่?
intrepidis

นี่คือสิ่งที่ฉันพบใน logcat เมื่อฉันต้องการตรวจสอบพฤติกรรมหลายเธรด คุณสามารถลองส่งออกรหัสเธรด
yushulx

8
ฉันขอแนะนำอย่างยิ่งเนื่องจากค่านี้อาจเฉพาะสำหรับอุปกรณ์และ / หรือเวอร์ชัน Android ของคุณ แม้ว่าจะเป็นเช่นนั้นในอุปกรณ์ Android ทุกเครื่องในตอนนี้ แต่ก็ไม่มีการรับประกันว่าจะยังคงเป็นเช่นนั้นในเวอร์ชันที่ใหม่กว่า การบันทึก ID เธรดในสมาชิกคลาสเมื่อรัน onCreate () ดูเหมือนจะสมเหตุสมผลกว่าสำหรับฉันเล็กน้อย
personne3000

1

คุณใช้runOnUiThreadวิธีนี้ในActivityชั้นเรียนไม่ได้หรือดู ..

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29


4
แอปพลิเคชันของฉันใช้งานได้ แต่มีผู้เขียนหลายคนและค่อนข้างใหญ่และซับซ้อน สิ่งที่ฉันต้องการทำคือการเพิ่มตาข่ายนิรภัยพิเศษซึ่งเป็นการยืนยันว่าจะจับการโจมตีผิดพลาดหากมีคนเรียกใช้เมธอดที่ออกแบบมาให้เรียกจากเธรด GUI จากเธรดอื่นเท่านั้น
ParDroid

ฉันกำลังแก้ไขข้อบกพร่องที่การใช้ runOnUiThread ทำให้ UX กระพริบ
fobbymaster
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.