我的扫描器类扩展了 Application 并实现了 BeaconConsumer。当我尝试绑定(bind)或取消绑定(bind) BeaconManager 时,我收到 NullPointerException。
public class Scanner extends Application implements BeaconConsumer{
private BeaconManager beaconManager;
@Override
public void onCreate() {
try {
super.onCreate();
beaconManager = BeaconManager.getInstanceForApplication(this);
beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(" m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
}
catch (Exception e){
e.printStackTrace();
}
}
public void startScan(long period){
try {
if (beaconManager==null) {
beaconManager = BeaconManager.getInstanceForApplication(Scanner.this);
beaconManager.bind(Scanner.this);
beaconManager.setForegroundScanPeriod(period);
beaconManager.updateScanPeriods();
}
}
catch (Exception e){
e.printStackTrace();
}
}
public void stopScan(){
beaconManager.unbind(Scanner.this);
}
我收到以下错误:
W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'void org.altbeacon.beacon.BeaconManager.bind(org.altbeacon.beacon.BeaconConsumer)' on a null object reference
最佳答案
我怀疑问题是 Scanner
类的多个实例正在运行。通常,您不应该手动创建 Android 应用程序类(扩展应用程序的类)的实例。您在 AndroidManifest.xml 中声明这样一个类,并让 Android 操作系统在启动应用程序时实例化它。如果您通过调用其构造函数手动实例化该类,则不会调用 onCreate()
方法并且不会创建 beaconManager
。
如果您想从 Activity
中获取此类的实例,您可以调用 startScan()
或 stopScan()
等方法你可以使用:
扫描器 scanner = (Scanner) this.getApplication();
另外,请注意代码编写方式的另外两个问题:
如果调用
startScan()
、stopScan()
、startScan()
,第二个不会发生任何事情>startScan()
调用,因为beaconManager
不会为 nil。扫描不会重新开始。如果异步
bind(...);
调用尚未完成(通常它不会),导致代码落入 catch block 。一个简单的解决方法是删除对beaconManager.updateScanPeriods();
的调用,并简单地将beaconManager.setForegroundScanPeriod(period);
调用移动到bind( ...)
。
关于android - 在方法 ALTBeacon 中运行 BeaconManager.bind 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47843540/