runOnUiThread กับ Looper.getMainLooper () โพสต์ใน Android


101

ใครช่วยบอกฉันได้ไหมว่ามีความแตกต่างระหว่างการใช้ runOnUiThread () กับ Looper.getMainLooper () โพสต์ () เพื่อเรียกใช้งานบนเธรด UI ใน Android หรือไม่?

เกี่ยวกับสิ่งเดียวที่ฉันสามารถระบุได้คือเนื่องจาก runOnUiThread เป็นวิธีการทำกิจกรรมแบบไม่คงที่ Looper.getMainLooper () post () จึงสะดวกกว่าเมื่อคุณต้องการโค้ดบางอย่างในคลาสที่ไม่สามารถมองเห็นกิจกรรมได้ (เช่น อินเทอร์เฟซ)

ฉันไม่ได้มองหาการสนทนาว่าควรดำเนินการบางอย่างในเธรด UI อย่างไรฉันเข้าใจว่าบางสิ่งทำไม่ได้และหลายสิ่งที่ดีไม่ควรอย่างไรก็ตามบางสิ่ง (เช่นการเริ่มต้น AsyncTask) ต้องดำเนินการจาก เธรด UI

ขอบคุณ
อาร์


6
ไม่มีความแตกต่างยกเว้นว่าrunOnUiThreadจะตรวจสอบว่าเป็นเธรด UI อยู่แล้วหรือไม่และดำเนินการงานของคุณโดยตรงแทนที่จะโพสต์เป็นMessage
zapl

1
ขอบคุณ. คุณช่วยแปลงเป็นคำตอบได้ไหมฉันจะยอมรับมันได้ไหม ??
รวย

นอกจากนี้ฉันได้เขียนโค้ดเพื่อตรวจสอบว่ามีการดำเนินการบางอย่างในเธรด UI หรือไม่ดังนั้นจึงง่ายมากที่จะรวมด้วยตนเอง
รวย

คำตอบ:


194

ต่อไปนี้จะทำงานเหมือนกันเมื่อเรียกจากเธรดพื้นหลัง:

  • โดยใช้ Looper.getMainLooper()

    Runnable task = getTask();
    new Handler(Looper.getMainLooper()).post(task);
    
  • โดยใช้ Activity#runOnUiThread()

    Runnable task = getTask();
    runOnUiThread(task);
    

ข้อแตกต่างเพียงอย่างเดียวคือเมื่อคุณทำเช่นนั้นจากเธรด UI ตั้งแต่นั้นมา

public final void runOnUiThread(Runnable action) {
    if (Thread.currentThread() != mUiThread) {
        mHandler.post(action);
    } else {
        action.run();
    }
}

จะตรวจสอบว่าเธรดปัจจุบันเป็นเธรด UI อยู่แล้วหรือไม่จากนั้นดำเนินการโดยตรง การโพสต์เป็นข้อความจะทำให้การดำเนินการล่าช้าออกไปจนกว่าคุณจะกลับมาจากวิธี UI-thread ปัจจุบัน

นอกจากนี้ยังมีวิธีที่สามในการรันRunnableเธรด UI ซึ่งจะเป็นView#post(Runnable)- วิธีนี้จะโพสต์ข้อความเสมอแม้ว่าจะเรียกจากเธรด UI ก็ตาม ซึ่งมีประโยชน์เนื่องจากจะช่วยให้มั่นใจได้ว่าViewมีการสร้างอย่างถูกต้องและมีเค้าโครงก่อนที่จะเรียกใช้โค้ด

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