@Override
        public void getBeacons(Collection<Beacon> beacons) {
          // 防止停止收集beacons前,再次收到此回调,导致重复记录,在开始和结束监控(查找)beacons时设置。
          if (isRecorded) return; // 已经记录了

          // 日志记录和屏幕显示Beacon信息
          // 有可能到达采样周期时,没有找到所有beacons,甚至是0个beacons,因此,应重复记录,一直到采样周期结束。当然是最后更新的有效。
          String str = "beacons=" + beacons.size();
          LogManager.d(TAG, str);
          logToDisplay(str);
          String rssi;
          for (Beacon beacon : beacons) {
            // becaon的两个id(major,minor),rssi及其平均值
            str =
                beacon.getId2()
                    + ":"
                    + beacon.getId3()
                    + "="
                    + beacon.getRssi()
                    + ","
                    + String.format("%.2f", beacon.getRunningAverageRssi());
            LogManager.d(TAG, str);
            logToDisplay(str);

            // 记录至mBeaconsRssi
            rssi =
                beacon.getId2()
                    + "_"
                    + beacon.getId3()
                    + ":"
                    + String.format("%.2f", beacon.getRunningAverageRssi());
            mBeaconsRssi.put(beacon, rssi);
          }

          // 记录参考点的各个beacon的id和rssi平均值
          if ((System.currentTimeMillis() - startSample) >= SamplePeroid) {
            // 将目前定位参考点测量的各个beacons的rssi平均值计入数据库。
            SaveRssiToDb();

            str =
                "记录完毕,定位参考点[" + reference_pointPerf + reference_pointNum + "]" + "各个beacon的rssi平均值";
            LogManager.d(TAG, str);
            logToDisplay(str);
            // 以下必须在UI现成中执行,否则,程序将异常终止。
            runOnUiThread(
                new Runnable() {
                  public void run() {
                    String str = "记录完毕,定位参考点[" + reference_pointPerf + reference_pointNum + "]";
                    Toast.makeText(trainingActivity.this, str, Toast.LENGTH_LONG).show();
                    // 下一个参考点默认名称
                    reference_pointNum++;
                    reference_point_edit.setText(reference_pointPerf + reference_pointNum);

                    // 停止查找beacons
                    onMonitoringStop(null);
                  }
                });
          }
        }
 /**
  * 每个扫描周期结束,根据20秒内各beacon的RSSI平均值计算它的距离,该回调获取这些beacon的距离值 Called once per second (实际上是每扫描周期)
  * to give an estimate of the mDistance to visible beacons
  */
 @Override
 public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
   LogManager.d(TAG, "didRangeBeaconsInRegion(),beacons=" + beacons.size());
   for (Beacon beacon : beacons) {
     LogManager.d(TAG, beacon.getId2() + ":" + beacon.getId3() + "," + beacon.getDistance());
   }
   Beacon beacon = mNearestBeacon.getNearestBeacon(mGetBeaconType, beacons);
   mOnNearestBeaconListener.getNearestBeacon(mGetBeaconType, beacon);
 }