我的扫描器类扩展了应用程序并实现了BeaconConsumer。当我试图绑定或取消绑定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发布于 2017-12-16 12:16:10
我怀疑问题在于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();的调用,并在调用bind(...)之前简单地移动beaconManager.setForegroundScanPeriod(period);调用。https://stackoverflow.com/questions/47843540
复制相似问题