ฉันสงสัยว่าฉันใช้วิธีการที่ถูกต้องเพื่อเรียกบางสิ่งในเธรดอื่นหรือไม่ ฉันกำลังทำบน Android แต่คิดว่ามันเป็นคำถาม Java ทั่วไป
ฉันมีวิธีการพร้อมพารามิเตอร์บางตัว ให้บอกว่าพวกเขาเป็น int
class Main1 {
public static void mainOnlyWork(int x, int y) {
// not important here.
}
}
class Test {
Handler mHandler;
// called from main thread, stored as reference.
public Test() {
mHandler = new Handler();
}
public static void callInMainThread(final int x, final int y) {
mHandler.post(new Runnable() {
public void run() {
Main1.mainOnlyWork(x, y);
}
});
}
ตอนนี้คำถามของฉันคือ ปลอดภัยไหมที่จะใช้ int สุดท้ายเพื่อสร้างการรันแบบไม่ระบุชื่อโดยไม่มีสมาชิกคลาส หากฉันละคีย์เวิร์ดสุดท้ายสำหรับพารามิเตอร์ x และ y Eclipse จะบ่น สำหรับฉันแล้วดูเหมือนว่ามีจุดประสงค์เพื่อใช้เฉพาะตัวเลขคงที่ในกรณีเช่นนี้ ถ้าฉันผ่านไม่คงที่จะโอเคไหม? Java "ทำให้" มันคงที่โดยส่งผ่านไปยังฟังก์ชันนี้หรือไม่
แต่ฉันต้องการเรียก Test.callInMainThread จากเจ้าของภาษาโดยใช้ JNI ไม่มีทางที่ Java จะสามารถบอกได้ว่าตัวเลขเหล่านั้นเป็นค่าคงที่หรือไม่ในความคิดของฉัน ฉันสามารถไว้วางใจ Java เพื่อสร้างเวทย์มนตร์ได้หรือไม่? มันจะทำงานแบบนี้ตลอดไปหรือเปล่า?
ฉันคิดว่าบางทีฉันอาจต้องสร้างคลาสพรอกซีเช่น:
private abstract RunnableXY implements Runnable {
public RunnableXY(int x, int y) {
this.x = x;
this.y = y;
}
public int x;
public int y;
public abstract void run();
}
และวิธีการโทรจะใช้:
public static void callInMainThread(final int x, final int y) {
mHandler.post(new RunnableXY(x,y) {
public void run() {
Main1.mainOnlyWork(this.x, this.y);
}
});
}
ด้วยวิธีนี้ ฉันจะปกป้องค่าจากการรวบรวมขยะจนกว่า runable จะถูกใช้และทิ้งไป ฉันต้องสร้าง wrappers หรือทำเครื่องหมาย x สุดท้ายในพารามิเตอร์วิธีการว่าปลอดภัยหรือไม่ เมื่อฉันลองใช้ คำหลักสุดท้ายก็ทำงานได้ดี อย่างไรก็ตาม ในกระทู้ต่างๆ ฉันไม่คิดว่าถ้ามันใช้งานได้ตอนนี้จะเป็นเหตุผลที่มันจะใช้งานได้ตลอดไปเช่นกัน มันใช้งานได้กับขั้นสุดท้ายเสมอหรือไม่? ถ้าทำได้จะทำยังไง? จะมีความแตกต่างหรือไม่หากพารามิเตอร์ไม่ใช่ประเภทดั้งเดิม แต่เป็นวัตถุ
อัปเดต: ฉันเข้าใจแล้วว่าสุดท้ายหมายถึงอะไรใน Java นั่นไม่ใช่ประเด็นของคำถาม คำถามคือขอบเขตของตัวแปรที่ใช้ในการสร้าง Runnable อยู่ที่ไหน พวกเขาเป็นคนท้องถิ่น ซึ่งหมายความว่าหลังจากสิ้นสุดฟังก์ชันแล้ว ค่าของพวกเขาจะไม่สามารถอ้างอิงได้ ค่านั้นเก็บไว้ที่ไหนเมื่อวัตถุ Runnable ถูกส่งผ่านไปยังเธรดอื่นและรอให้ดำเนินการ