【问题标题】:Android TextView.setText working only sometimes inside RunnableAndroid TextView.setText 有时只能在 Runnable 中工作
【发布时间】:2017-07-19 20:21:47
【问题描述】:

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

    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);

请查看我的 cmets 以了解哪些 setText() 函数有效或无效。 else if 中的那个是唯一不工作的那个。

有什么想法吗?

感谢您的帮助!

【问题讨论】:

  • 您是否尝试过调试以发现当 setText() 不调用时您的可运行对象是否已被执行?
  • 当你说“不工作”时,你是什么意思?此外,“else if”有mHandler.post(this),它不会延迟,而不是mHandler.postDelayed(this,1000),它会延迟一秒钟。那是你想做的吗?

标签: java android runnable settext


【解决方案1】:

这是因为你正在调用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++;
                }

【讨论】:

  • 感谢您的帮助。不幸的是,这不会产生任何变化。延迟不是在等待。
  • 我可以知道你的 count、gestureCounter 和 selectedItems.size() 在开始时的值吗..?
  • count=4,手势计数器=0,selectedItems.size()=3。谢谢
  • 我更新了我的答案看看如果你有任何疑问让我知道。
  • 我知道您要做什么,但是需要 while 循环才能等到另一个过程完成,此过程所需的时间会有所不同,因此我无法通过 postDelay 预测它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多