我的scanner类扩展了应用程序并实现了beaconsumer。当我尝试绑定或解除绑定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 = (Scanner) this.getApplication();
另外,请注意代码编写方式的另外两个问题:
如果您调用startScan()
,stopScan()
,startScan()
,则第二个startScan()
调用不会发生任何事情,因为beaconManager
不会为零。扫描将不会重新启动。
如果异步beaconManager.updateScanPeriods();
调用尚未完成(通常不会),则对bind(...);
的调用将失败,从而导致代码落入catch块中。一个简单的解决方法是删除对beaconManager.updateScanPeriods();
的调用,并在调用到beaconManager.setForegroundScanPeriod(period);
之前简单地移动bind(...)
调用。
关于android - 在方法ALTBeacon中运行BeaconManager.bind时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47843540/