วิธีที่เหมาะสมในการรับอินพุตจากผู้ใช้ใน Android แล้วดำเนินการต่อไป

ฉันกำลังใช้งานล่ามสำหรับภาษาการเขียนโปรแกรมที่คล้ายกับ Pascal/BASIC ที่เรียบง่ายปานกลางใน Android ฉันได้ทำ parser เสร็จแล้ว ดังนั้นโปรแกรมต่างๆ จะได้รับการจดจำ โหลดในหน่วยความจำ และพร้อมที่จะดำเนินการ ภาษานี้เป็น ขั้นตอน เลียนแบบ อินพุต/เอาต์พุตบรรทัดคำสั่ง และเห็นได้ชัดว่า ไม่ได้ขับเคลื่อนด้วยเหตุการณ์ เช่น Java ใน Android

โปรแกรมตัวอย่างอาจมีลักษณะดังนี้:

FOR i FROM 1 TO 10
    READ Name
    PRINT "User ", i, " name: ", Name
END_LOOP

เนื่องจากค่อนข้างใหม่กับ Android ฉันไม่รู้ว่ากล่องโต้ตอบของ Android เป็นแบบอะซิงโครนัส และดังนั้นจึงไม่สามารถขัดจังหวะการดำเนินการได้ ตามที่อธิบายไว้ในคำถามที่คล้ายกันหลายสิบข้อ (1), (2), (3), (4)
ตอนแรกฉันคิดว่า ฉันจะใช้คำสั่ง READ โดยแสดง modal Dialog การรันโค้ดที่เกี่ยวข้องกับอินพุต การอ่าน จากผู้ใช้ จะ ต้องรอ เพื่อให้เสร็จสิ้นก่อนที่จะไปยังบรรทัดถัดไปของโค้ด แต่สิ่งนี้ไม่ควรทำด้วยกล่องโต้ตอบ ดังที่กล่าวไว้ในโพสต์ข้างต้น

ฉันพบว่าวิธีที่ "เหมาะสม" ที่สุดคือ "บันทึก" สถานะการดำเนินการของโปรแกรมทั้งหมด หยุดการดำเนินการ จากนั้นจึงเริ่มดำเนินการโดยการโหลดสถานะสุดท้าย เมื่อผู้ใช้ป้อนข้อมูลบางอย่างจากกล่องโต้ตอบ แต่ดูเหมือนว่าจะเป็นไปไม่ได้ และยุ่งยากมากเกินไปสำหรับงานง่ายๆ เช่นนี้ มีวิธีที่ง่ายกว่านี้ไหม?

ข้อเสนอแนะใด ๆ ยินดีต้อนรับ


person mavrosxristoforos    schedule 26.11.2016    source แหล่งที่มา


คำตอบ (1)


ฉันไม่รู้ว่ากล่องโต้ตอบของ Android เป็นแบบอะซิงโครนัส และไม่สามารถขัดขวางการดำเนินการได้ ตามที่อธิบายไว้ในคำถามที่คล้ายกันหลายสิบข้อ

Android UI ทั้งหมดเป็นแบบอะซิงโครนัส

ตอนแรกฉันคิดว่าจะใช้คำสั่ง READ โดยแสดงกล่องโต้ตอบโมดอล

ไม่มีอะไรผิดปกติกับเรื่องนี้ อย่างไรก็ตาม READ จะต้องระงับการดำเนินการล่ามของคุณจนกว่าผู้ใช้จะเสร็จสิ้นกล่องโต้ตอบ

มีวิธีที่ง่ายกว่านี้ไหม?

ออกจากข้อมือ...

ขั้นตอนที่ #1: เรียกใช้ล่ามของคุณบนเธรดพื้นหลัง

ขั้นตอนที่ #2: ให้โค้ด READ ของคุณเรียกใช้กล่องโต้ตอบของคุณบนเธรดแอปพลิเคชันหลัก จากนั้นบล็อกบน Semaphore เพื่อบล็อกเธรดพื้นหลังของคุณ

ขั้นตอนที่ #3: ให้โค้ดโต้ตอบของคุณรับผลลัพธ์ของการป้อนข้อมูลของผู้ใช้ไปยังล่ามของคุณด้วยวิธีใดวิธีหนึ่ง จากนั้นปล่อย Semaphore เมื่อกล่องโต้ตอบหายไป

ขั้นตอนที่ #4: รหัสล่ามของคุณดำเนินต่อไป

person CommonsWare    schedule 26.11.2016
comment
ขอบคุณมากสำหรับคำตอบของคุณ. ฉันจะพยายามนำไปใช้ในวันพรุ่งนี้และยอมรับคำตอบทันทีที่ฉันอ่านตัวแปรแรก ;-) - person mavrosxristoforos; 27.11.2016
comment
ฉันเพิ่งทำมัน ขอบคุณสำหรับคำตอบ. สำหรับผู้อ่านในอนาคต ฉันได้ดำเนินการดังต่อไปนี้: 1. ให้ล่ามของฉันใช้อินเทอร์เฟซ Runnable 2. สร้าง Semaphore และส่งผ่านไปยังล่าม 3. เริ่มต้นบนเธรดใหม่ โดยเขียน new Thread(interpreter).start(); 4. เปิดกล่องโต้ตอบโดยใช้ Handler(Looper.getMainLooper()).post 5. รอใบอนุญาตจาก Semaphore ถึง release() 6 ทำต่อ - person mavrosxristoforos; 27.11.2016