ฉันต้องตรวจสอบว่าเธรดที่รันโค้ดบางส่วนเป็นเธรดหลัก (UI) หรือไม่ ฉันจะบรรลุสิ่งนี้ได้อย่างไร
ฉันต้องตรวจสอบว่าเธรดที่รันโค้ดบางส่วนเป็นเธรดหลัก (UI) หรือไม่ ฉันจะบรรลุสิ่งนี้ได้อย่างไร
คำตอบ:
Looper.myLooper() == Looper.getMainLooper()
หากสิ่งนี้กลับเป็นจริงแสดงว่าคุณอยู่ในเธรด UI!
คุณสามารถใช้โค้ดด้านล่างเพื่อทราบว่าเธรดปัจจุบันเป็น UI / เธรดหลักหรือไม่
if(Looper.myLooper() == Looper.getMainLooper()) {
// Current Thread is Main Thread.
}
หรือคุณสามารถใช้สิ่งนี้
if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
// Current Thread is Main Thread.
}
Looper.myLooper()
จะคืนค่า null ถ้าเธรดไม่เกี่ยวข้องกับ Looper ดังนั้นทั้งคู่จึงปลอดภัยและได้ผลเหมือนกัน แต่อันแรกช้ากว่าเล็กน้อยในขณะที่ค้นหาภายในแผนที่เพื่อค้นหา looper และเธรดที่เกี่ยวข้องและทำสิ่งอื่น ๆ
วิธีที่ดีที่สุดคือวิธีที่ชัดเจนและแข็งแกร่งที่สุด: *
Thread.currentThread().equals( Looper.getMainLooper().getThread() )
หรือหากแพลตฟอร์มรันไทม์คือ API ระดับ 23 (Marshmallow 6.0) หรือสูงกว่า:
Looper.getMainLooper().isCurrentThread()
ดูLooper API โปรดทราบว่าการโทรLooper.getMainLooper()
เกี่ยวข้องกับการซิงโครไนซ์ (ดูแหล่งที่มา ) คุณอาจต้องการหลีกเลี่ยงค่าใช้จ่ายโดยการเก็บค่าส่งคืนและนำกลับมาใช้ใหม่
* เครดิตgreg7gkbและ2cupsOfTech
Looper.myLooper() == Looper.getMainLooper()
ซึ่งฉันคิดว่าชัดเจนน้อยกว่า ฉันให้เครดิต greg7gkb
equals
ดังนั้นจึงกลับไปที่==
แต่อาจเปลี่ยนแปลงได้ในอนาคต ดังนั้นฉันจึงแก้ไขคำตอบ
สรุปการแก้ปัญหาฉันคิดว่านั่นเป็นวิธีที่ดีที่สุด:
boolean isUiThread = VERSION.SDK_INT >= VERSION_CODES.M
? Looper.getMainLooper().isCurrentThread()
: Thread.currentThread() == Looper.getMainLooper().getThread();
และหากคุณต้องการเรียกใช้งานบางอย่างบนเธรด UI คุณสามารถใช้สิ่งนี้:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
//this runs on the UI thread
}
});
คุณสามารถตรวจสอบ
if(Looper.myLooper() == Looper.getMainLooper()) {
// You are on mainThread
}else{
// you are on non-ui thread
}
อนุญาตให้ฉันนำหน้าสิ่งนี้ด้วย: ฉันยอมรับว่าโพสต์นี้มีแท็ก 'Android' อย่างไรก็ตามการค้นหาของฉันไม่มีส่วนเกี่ยวข้องกับ 'Android' และนี่เป็นผลลัพธ์อันดับต้น ๆ ของฉัน ด้วยเหตุนี้สำหรับผู้ใช้ที่ไม่ใช่ Android SO Java ที่จะมาถึงที่นี่อย่าลืม:
public static void main(String[] args{
Thread.currentThread().setName("SomeNameIChoose");
/*...the rest of main...*/
}
หลังจากตั้งค่านี้ที่อื่นในรหัสของคุณคุณสามารถตรวจสอบได้อย่างง่ายดายว่าคุณกำลังจะรันบนเธรดหลักด้วย:
if(Thread.currentThread().getName().equals("SomeNameIChoose"))
{
//do something on main thread
}
ฉันเขินอายนิดหน่อยก่อนที่จะจดจำสิ่งนี้ แต่หวังว่ามันจะช่วยคนอื่นได้!
คุณสามารถตรวจสอบได้ใน android ddms logcat โดยที่ id กระบวนการจะเหมือนกัน แต่ id ของเธรดจะแตกต่างกัน
Xamarin.Android
พอร์ต: ( C#
)
public bool IsMainThread => Build.VERSION.SdkInt >= BuildVersionCodes.M
? Looper.MainLooper.IsCurrentThread
: Looper.MyLooper() == Looper.MainLooper;
การใช้งาน:
if (IsMainThread) {
// you are on UI/Main thread
}
คุณสามารถลองใช้ Thread.currentThread (). isDaemon ()