【问题标题】:Return boolean value from CountDownTimer从 CountDownTimer 返回布尔值
【发布时间】:2018-05-16 22:27:08
【问题描述】:

我有一个 5 秒倒计时计时器,我需要检测持续时间内的加速度幅度。如果幅度满足陈述,则返回一个真值。但是,由于 void 方法 OnTick 并且它也是一个内部类,我无法将任何值返回或传递给外部类。

public boolean low_high_Detection(final double ampA) {
    new CountDownTimer(5000, 1000) {
        public void onTick(long millisUntilFinished) {
            final double low_TH = 9.0, high_TH = 10.5;
            boolean lying_on_floor = false;
            if(ampA > low_TH && ampA <high_TH)
            {
                lying_on_floor = true;
            }
        }
        public void onFinish() {
            Toast.makeText(detect.getBaseContext(), "5 seconds dectection over",Toast.LENGTH_SHORT).show();
        }
    }.start();

    if (lying_on_floor == true)
    {
        return true;
    }
    return false;
}

任何人都可以建议我如何解决此方法?或者还有另一种处理方式。

【问题讨论】:

  • 使布尔值 lie_on_floor = false;作为类字段。
  • 感谢您的回复。抱歉,我的 oo 概念不是很好。类字段是指getter和setter吗? @Deepakkaku
  • 不只是在类中的函数之外声明它。这样它就成为一个类字段,在其所有功能中都有其范围
  • 哦,太好了,谢谢。您是否知道如何将 ampA 传递给 CountDownTimer 类? ampA 值将不断变化。 @Deepakkaku
  • 类似于布尔值应该可以工作。使其成为类字段

标签: android countdowntimer


【解决方案1】:

这可以通过匿名类作为监听器来实现。

声明一个充当监听器的接口。

public interface LowHightDetectionListener {
   void onDetected(boolean result);
}

然后,调用此方法并将此侦听器的一个实例传递给方法low_high_Detection()

low_high_Detection(ampA, new LowHightDetectionListener {
   @Override
   public void onDetected(boolean result) {
      // Process the result
   }
});

在这里你得到“返回”的值。

要在low_high_Detection() 方法中返回所需的值,您需要调用监听器。

public void low_high_Detection(final double ampA, final LowHightDetectionListener callback) {
    new CountDownTimer(5000, 1000) {
      public void onTick(long millisUntilFinished) {
        final double low_TH = 9.0, high_TH = 10.5;
        boolean lying_on_floor = false;
        if(ampA > low_TH && ampA <high_TH) {
            lying_on_floor = true;
            callback.onDetected(true); // EXAMPLE OF RETURNING VALUE INSIDE AN ANONYMOUS CLASS
         }
      }

      public void onFinish() {
        Toast.makeText(detect.getBaseContext(), "5 seconds dectection over",Toast.LENGTH_SHORT).show();
      }
   }.start();

   if (lying_on_floor == true) {
     callback.onDetected(true);
     return;
   }
   callback.onDetected(false);
  }
}

【讨论】:

  • 感谢您的回复。请问我应该如何将侦听器的实例传递给方法?比如在哪个部位?实际上, lie_on_floor == true,由于内部类,该变量也无法访问。并且参数有错误,ampA不能是最终的,自动更正atm有一些我没有注意到的错误。你有什么想法让这个方法有效吗?
  • 你应该这样调用这个方法:low_high_Detection(ampA, new LowHightDetectionListener { @Override public void onDetected(boolean result) { // 处理结果 } });答案是带有调用的代码示例。如果从匿名类内部访问 ampA,它应该是 final 的。
  • 我需要更多上下文来了解如何修复或改进此方法。
  • 我想我在调用部分得到了它,我刚刚意识到你将这个方法更改为无效。但还有两件事,首先,if 语句中的 bool lie_on_floor 不可访问。其次,ampA实际上需要从传感器连续传入5秒进行检查,它不可能是最终的不是吗?
  • 分享更多代码以便更好地理解您的问题。
猜你喜欢
  • 2018-08-22
  • 2013-03-11
  • 2018-06-03
  • 1970-01-01
  • 2013-08-18
  • 2013-05-21
  • 2019-06-18
  • 2017-06-07
相关资源
最近更新 更多