post : post ทำให้ Runnable ถูกเพิ่มลงในคิวข้อความ
Runnable:แสดงถึงคำสั่งที่สามารถเรียกใช้งานได้ มักใช้เพื่อรันโค้ดในเธรดอื่น
run () : เริ่มเรียกใช้ส่วนที่ใช้งานอยู่ของรหัสคลาส เมธอดนี้เรียกว่าเมื่อเธรดเริ่มต้นที่ถูกสร้างขึ้นด้วยคลาสที่ใช้ Runnable
getView().post(new Runnable() {
@Override
public void run() {
getView().startAnimation(a);
}
});
รหัส :getView().startAnimation(a);
ในรหัสของคุณ
โพสต์ทำให้ Runnable ( รหัสจะถูกเรียกใช้ในเธรดอื่น) เพื่อเพิ่มคิวข้อความ
ดังนั้น startAnimation จะเริ่มทำงานในเธรดใหม่เมื่อดึงข้อมูลจากmessageQueue
[แก้ไข 1]
เหตุใดเราจึงใช้เธรดใหม่แทนเธรด UI (เธรดหลัก)
เธรด UI:
เมื่อแอปพลิเคชันเริ่มต้น Ui Thread จะถูกสร้างขึ้นโดยอัตโนมัติ
มีหน้าที่จัดส่งเหตุการณ์ไปยังวิดเจ็ตที่เหมาะสมและรวมถึงเหตุการณ์การวาดด้วย
นอกจากนี้ยังเป็นเธรดที่คุณโต้ตอบกับวิดเจ็ต Android ด้วย
ตัวอย่างเช่นหากคุณแตะปุ่มบนหน้าจอเธรด UI จะส่งเหตุการณ์การสัมผัสไปยังวิดเจ็ตซึ่งจะตั้งค่าสถานะกดและโพสต์คำขอที่ไม่ถูกต้องไปยังคิวเหตุการณ์ เธรด UI จะยกเลิกการร้องขอและแจ้งให้วิดเจ็ตวาดใหม่
จะเกิดอะไรขึ้นหากผู้ใช้กดปุ่มซึ่งจะใช้เวลานาน
((Button)findViewById(R.id.Button1)).setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
final Bitmap b = loadImageFromNetwork();
mImageView.setImageBitmap(b);
}
});
UI หยุดทำงาน โปรแกรมอาจผิดพลาดด้วยซ้ำ
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
final Bitmap b = loadImageFromNetwork();
mImageView.setImageBitmap(b);
}
}).start();
}
มันทำลายกฎของ Android ที่ไม่เคยอัปเดต UI โดยตรงจากเธรดของผู้ปฏิบัติงาน
Android มีหลายวิธีในการเข้าถึงเธรด UI จากเธรดอื่น
- Activity.runOnUiThread (รันได้)
- View.post (รันได้)
- View.postDelayed (รันได้ยาว)
- ตัวจัดการ
เช่นด้านล่าง
View.post (รันได้)
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
final Bitmap b = loadImageFromNetwork();
mImageView.post(new Runnable() {
public void run() {
mImageView.setImageBitmap(b);
}
});
}
}).start();
}
ตัวจัดการ
final Handler myHandler = new Handler(Looper.getMainLooper());
(new Thread(new Runnable() {
@Override
public void run() {
final Bitmap b = loadImageFromNetwork();
myHandler.post(new Runnable() {
@Override
public void run() {
mImageView.setImageBitmap(b);
}
});
}
})).start();
}

สำหรับข้อมูลเพิ่มเติม
http://android-developers.blogspot.com/2009/05/painless-threading.html
http://www.aviyehuda.com/blog/2010/12/20/android-multithreading-in-a-ui-environment/