แอปขัดข้อง onCreate เนื่องจากตัวจับเวลา [ปิด]

ฉันมีปัญหากับแอปของฉันขัดข้องเมื่อฉันลองใช้รหัสนี้ ฉันต้องการให้ตรวจสอบอย่างต่อเนื่องว่า MediaPlayer (MP) กำลังเล่นอยู่หรือไม่ และหากเป็นนั้น ฉันต้องการให้ข้อความอ่านว่า "กำลังเล่น" - แต่หากไม่เล่น ฉันต้องการให้อ่านว่า "ไม่ได้เล่น"

ฉันไม่ได้รับคำเตือนใดๆ จาก Eclipse แต่เมื่อฉันส่งออกมัน มันขัดข้องขณะโหลด ฉันรู้ว่ารหัสสำหรับการตั้งค่า TextView ไม่อยู่ที่นั่น แต่นั่นไม่ใช่ปัญหา ( ฉันคิดว่า ) หากมีวิธีอื่นในการทำเช่นนี้ ฉันยินดีที่จะผลักดันไปในทิศทางที่ถูกต้อง

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
                      //The Timer
                                Thread playingtimer = new Thread (){
                                    public void run() {
                                        try{
                                            int time = 1;
                                            while(time > 0) {
                                            sleep(100);

                                            if (MP.isPlaying()){ 
                                //set the TextView here "Now Playing"
                                            }
                                            else 
                                //set the TextView to "NOT Playing"
                                            }
                                        } 
                                        catch (InterruptedException e) {
                                        e.printStackTrace();
                                        }
                                        finally{

                                        }
                                    }
                                };
                                playingtimer.start();

person ZimZux    schedule 01.10.2013    source แหล่งที่มา
comment
โพสต์ Logcat. การวินิจฉัยข้อขัดข้องโดยไม่มีข้อผิดพลาดนั้นค่อนข้างยาก   -  person Prmths    schedule 01.10.2013


คำตอบ (2)


ฉันรู้ว่ารหัสสำหรับการตั้งค่า TextView ไม่อยู่ที่นั่น แต่นั่นไม่ใช่ปัญหา ( ฉันคิดว่า )

นั่นคือปัญหาอย่างแม่นยำ คุณกำลังพยายามอัปเดต View จากพื้นหลัง Thread คุณควรใช้ runOnUiThread(), Handler หรือ AsyncTask ในการอัปเดต UI

คำตอบเหล่านี้พูดถึงตัวจัดการและอะซิงก์ทาสก์

ตัวอย่าง runOnUiThread

person codeMagic    schedule 01.10.2013
comment
ข้อใดต่อไปนี้เรียนรู้ได้ง่ายที่สุด? - person ZimZux; 01.10.2013
comment
ฉันชอบ AsyncTask แต่ runOnUiThread() ก็ค่อนข้างง่ายเช่นกัน - person codeMagic; 01.10.2013
comment
ฉันได้โพสต์ลิงก์ตัวอย่างไว้สองสามรายการเพื่อให้คุณเห็นว่าคุณต้องการทำอะไร - person codeMagic; 01.10.2013
comment
ขอบคุณมาก... ฉันต่อสู้กับสิ่งนี้ในช่วงสองสามชั่วโมงที่ผ่านมา .. - person ZimZux; 01.10.2013

ปัญหาคือหากคุณพยายามแก้ไข TextView จากตัวจับเวลานั้น มันจะพัง เนื่องจากหนึ่งในกฎที่สำคัญที่สุดใน Android คือคุณไม่สามารถแก้ไขมุมมองใด ๆ จากเธรดอื่นนอกเหนือจากเธรดหลักได้ และคุณกำลังพยายาม เปลี่ยนจากเธรดผู้ปฏิบัติงานที่คุณกำหนดเอง เพื่อให้ทำงานได้ ให้ล้อมโค้ดที่กำลังแก้ไขมุมมองเป็นเมธอด runOnUIThread หรือสร้างกลไกตัวจัดการของคุณเองเพื่อรันโค้ดนั้นในเธรดหลัก

หวังว่านี่จะช่วยได้

ความนับถือ!

person Martin Cazares    schedule 01.10.2013