我试着在信标上建立一个应用程序。因此,我从here.获得了一个示例代码
我已经运行了该代码,一旦我进入信标范围,应用程序就会崩溃,logcat中的错误如下:
06-20 17:48:24.256: E/AndroidRuntime(18104): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.请帮帮我。
我检查了代码,错误就在这些行之间。
iBeaconManager.setRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<IBeacon> iBeacons, Region region) {
if (iBeacons.size() > 0) {
double distance = iBeacons.iterator().next().getAccuracy();
DecimalFormat decimalFormat = new DecimalFormat("##.##");
double distanceFormatted = Double.valueOf(decimalFormat.format(distance));
TextView distanceTextView = (TextView) findViewById(R.id.am_tv_distance);
distanceTextView.setText(String.valueOf(distanceFormatted) + " m");
}
}
});发布于 2014-06-20 20:23:21
您需要在UI线程中执行UI更改:
iBeaconManager.setRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<IBeacon> iBeacons, Region region) {
if (iBeacons.size() > 0) {
double distance = iBeacons.iterator().next().getAccuracy();
DecimalFormat decimalFormat = new DecimalFormat("##.##");
double distanceFormatted = Double.valueOf(decimalFormat.format(distance));
runOnUiThread(new Runnable() {
@Override
public void run() {
TextView distanceTextView = (TextView) findViewById(R.id.am_tv_distance);
distanceTextView.setText(String.valueOf(distanceFormatted) + " m");
}
});
}
}
});发布于 2014-06-20 20:42:32
对于CalledFromWrongThreadException,
编写一个函数并像这样调用:
private void toastToDisplay(final String line) {
runOnUiThread(new Runnable() {
public void run() {
//Toast.makeText(YourActivity.this, "" + line,
// Toast.LENGTH_LONG).show();
TextView yourTextView = (TextView) findViewById(R.id.your_tv);
yourTextView .setText(line);
}
});
} 如果需要,您可以使用所需的distanceTextView或其他视图编辑该函数。发生的情况是,Service在应用程序的后台线程上运行,因此当您直接调用将更新UI的操作时,它会与您在编写代码时所在的线程冲突。
因此,如果当前线程不是UI线程,则使用runOnUiThread将操作发送到UI线程的事件队列
“我得到的只是距离而不是范围”到底是什么意思?...for iBeacons.iterator().next().getAccuracy();,part..您可以使用for each循环收集信标详细信息,如下所示:
for (IBeacon iBeacon : iBeacons) {
String line = "Major: " + iBeacon.getMajor()
+ "Minor: " + iBeacon.getMinor()
+ "Accuracy in m(s): "
+ iBeacon.getAccuracy()
+ "BluetoothAddress: "
+ iBeacon.getBluetoothAddress()
+ "Proximity: " + iBeacon.getProximity()
+ "ProximityUuid: "
+ iBeacon.getProximityUuid() + "Rssi: "
+ iBeacon.getRssi() + "TxPower: "
+ iBeacon.getTxPower();
toastToDisplay(line);
} 如果你还没有看过,this Android iBeacon Library sample application是一个很好的参考资料。
https://stackoverflow.com/questions/24327156
复制相似问题