Android 在方法ALTBeacon内运行BeaconManager.bind时出错
我的scanner类扩展了应用程序并实现了BeaconConsumer。当我尝试绑定或解除绑定BeaconManager时,我得到一个NullPointerExceptionAndroid 在方法ALTBeacon内运行BeaconManager.bind时出错,android,altbeacon,Android,Altbeacon,我的scanner类扩展了应用程序并实现了BeaconConsumer。当我尝试绑定或解除绑定BeaconManager时,我得到一个NullPointerException public class Scanner extends Application implements BeaconConsumer{ private BeaconManager beaconManager; @Override public void onCreate() { try { sup
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
如果要从活动中获取此类的实例,可以调用startScan()
或stopScan()
等方法,可以使用:
Scanner=(Scanner)this.getApplication()代码>
此外,在编写代码的方式方面,还需要注意另外两个问题:
如果调用startScan()
,stopScan()
,startScan()
,则第二次调用startScan()
时不会发生任何事情,因为beaconManager
不会为零。扫描将不会重新启动
调用beaconManager.updateScanPeriods()如果异步绑定(…),则code>将失败代码>在尚未完成之前调用(通常不会),导致代码落入catch块。一个简单的修复方法是删除对beaconManager.updateScanPeriods()的调用
只需移动beaconManager.setForegroundScanPeriod(period)调用bind(…)
之前的code>调用
如果我尝试在onCreate()方法本身内部执行此操作,效果会很好。您何时调用startScan
?也许您在初始化beaconManager之前会这样做?我在MainActivity的onCreate()方法中创建了一个新的Scanner对象,并使用按钮运行startScan,然后您可以尝试添加一个空检查if(beaconManager==null)initBeaconManager()
在该方法中,您对itI进行初始化,但仍然会得到相同的错误