线程runOnUiThread暂停/恢复后notify()不继续

时间:2013-11-11 14:27:30

标签: java android multithreading

我正在制作应用程序,用于收听希腊语中的.mp3单词并在2000ms后显示它们但是当我暂停线程然后通知()后退线程再也不会再运行... TextView每2000ms都会更改但是当我暂停并通知时( )run()块不再执行任何操作,应用程序崩溃..我做错了什么?

class MyinnerThread implements Runnable  {
    String name;
    Thread tr;
    boolean suspendFlag;
    int i = 0;

    MyinnerThread(String threadname) {
        name = threadname;
        tr = new Thread(this, name);
        suspendFlag = false;
        tr.start();
    }

    public void run() {

        try {
            while(!suspendFlag){

            runOnUiThread(new Runnable() {
                @Override
                public void run() {

                    if(i == 0){tv1.setText("trhead1");}
                    if(i == 1){tv2.setText("trhead2");}
                    if(i == 2){tv3.setText("trhead3");}
                    if(i == 3){tv4.setText("trhead4");}
                    if(i == 4){tv5.setText("trhead5");}
                    if(i == 5){tv6.setText("trhead6");}
                    if(i == 6){tv7.setText("trhead7");}
                    if(i == 7){tv8.setText("trhead8");}

                    synchronized(signal) {
                        while(suspendFlag) {
                            try {
                                signal.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            });

            Thread.sleep(2000);
            i++;

           }
        } catch (InterruptedException e) {
            System.out.println(name + " interrupted.");
        }
    }
    void mysuspend() {
        suspendFlag = true;
    }

     void myresume() {

        synchronized(signal) {
            suspendFlag = false;
            signal.notify();
        }

}

}

编辑:最终代码在这里工作!

run() {

    try {
        while(true){

         synchronized(signal) {
               while(suspendFlag) {
                     try {
                         signal.wait();
                     } catch (InterruptedException e) {
                         e.printStackTrace();
                     }
                 }

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
              //....
                }
            }
        });

        Thread.sleep(2000);
        i++;
       }
    } 
}

}

1 个答案:

答案 0 :(得分:0)

    从UI线程中调用
  1. signal.wait()(我假设,runOnUIThread将在UI线程上执行给定的Runnable。这将阻止/冻结UI。将其从run()方法中取出并放入线程的主循环中。

  2. 重新思考主循环while (!suspendFlag)!这将中止整个任务,而不是暂停它。

  3. 最后,制作suspendFlag volatile以避免可见性问题。

相关问题