Android TextView.setText有时只在Runnable中运行

时间:2017-07-19 20:21:48

标签: java android runnable settext

我有一个postDelayed Runnable,从3开始倒计时执行一些代码x次。我通过setText()向用户显示文本。 setText()函数在if的某些区域中起作用,否则在其他区域中起作用,但在其他区域不起作用。

    final Runnable r1 = new Runnable() {
        @Override
        public void run() {
            if ((--count != 0) && (gestureCounter != selectedItems.size())) {
                mHandler.postDelayed(this, 1000);
                liveView.setText("Do " + selectedItems.get(gestureCounter) + " in " + String.valueOf(count));//works
            }
            else if(gestureCounter != selectedItems.size()){
                count=4;//3 seconds + 1
                liveView.setText("Hold " + selectedItems.get(gestureCounter));//NOT WORKING
                mHandler.post(this);
                fcalc.setTrain(true);
                while(fcalc.getTrain()){
                    //wait till trainig is done
                }
                gestureCounter++;
            }
            else{
                liveView.setText("");//works
                fcalc.Train();
                fcalc.setClassify(true);
            }
        }
    };
    mHandler.post(r1);

请查看我的评论,了解哪些setText()函数有效或无效。 else if中的那个是唯一一个无效的。

有什么想法吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这是因为你正在调用mHandler.post(this);这将立即调用处理程序再次运行,并且你正在递增值gestureCounter,所以下次将进入此循环并且它将转到第一个循环或第三循环按条件

尝试在该循环中添加延迟并检查

编辑:

由于你的while循环连续运行,UI没有更新,只需注释并运行如下条件的代码它将正常工作

像这样

                    else if(gestureCounter != selectedItems.size()){
                    liveView.setText("Hold " +
                            selectedItems.get(gestureCounter));//NOT WORKING

                    mHandler.postDelayed(this, 1000); // delay added 

                    if(fcalc.getTrain()) {
                        return;
                    }
                    count=4;//3 seconds + 1

//                    fcalc.setTrain(true);
//                    while(fcalc.getTrain()){
//                        //wait till trainig is done
//                    }
                    gestureCounter++;
                }