Android 在方法ALTBeacon内运行BeaconManager.bind时出错

Android 在方法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

我的scanner类扩展了应用程序并实现了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

我怀疑问题在于,
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进行初始化,但仍然会得到相同的错误