首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在方法BeaconManager.bind中运行ALTBeacon时出错

在方法BeaconManager.bind中运行ALTBeacon时出错
EN

Stack Overflow用户
提问于 2017-12-16 07:27:10
回答 1查看 393关注 0票数 3

我的扫描器类扩展了应用程序并实现了BeaconConsumer。当我试图绑定或取消绑定BeaconManager时,就会得到一个NullPointerException。

代码语言:javascript
复制
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);
}

我得到以下错误:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-16 12:16:10

我怀疑问题在于Scanner类有多个实例正在运行。通常,您不应该手动创建Android应用程序类的实例(扩展应用程序的实例)。您可以在AndroidManifest.xml中声明这样一个类,并让Android在启动应用程序时实例化它。如果通过调用类的构造函数手动实例化类,则不会调用onCreate()方法,也不会创建beaconManager

如果希望从Activity中获取该类的实例,那么可以调用startScan()stopScan()之类的方法,可以使用:

Scanner scanner = (Scanner) this.getApplication();

此外,对于代码编写方式的其他两个问题,也要小心:

  1. 如果您调用startScan()stopScan()startScan(),则在第二个startScan()调用中不会发生任何事情,因为beaconManager不会为零。扫描不会重新启动。
  2. 如果异步beaconManager.updateScanPeriods();调用尚未完成(通常不会),则对bind(...);的调用将失败,从而导致代码落入catch块。一个简单的解决方法是删除对beaconManager.updateScanPeriods();的调用,并在调用bind(...)之前简单地移动beaconManager.setForegroundScanPeriod(period);调用。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47843540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档