当 运行 BeaconManager.bind 在方法 ALTBeacon 中时出错
Error when running BeaconManager.bind inside a method ALTBeacon
我的扫描器 class 扩展了 Application 并实现了 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
class 运行 有多个实例。一般来说,您不应该手动创建 Android 应用程序 class 的实例(扩展应用程序的实例)。您在 AndroidManifest.xml 中声明这样一个 class,并让 Android OS 在启动应用程序时实例化它。如果您通过调用其构造函数手动实例化 class,则不会调用 onCreate()
方法并且不会创建 beaconManager
。
如果您想从 Activity
中获取此 class 的实例,以便您可以调用 startScan()
或 stopScan()
等方法,您可以使用:
Scanner scanner = (Scanner) this.getApplication();
还要注意代码编写方式的另外两个问题:
如果调用 startScan()
、stopScan()
、startScan()
,第二次 startScan()
调用不会发生任何事情,因为 beaconManager
会不是零。扫描不会重新启动。
调用beaconManager.updateScanPeriods();
如果之前的异步bind(...);
调用还没有完成(一般不会)就会失败,导致代码落入catch块.一个简单的解决方法是删除对 beaconManager.updateScanPeriods();
的调用,只需将 beaconManager.setForegroundScanPeriod(period);
调用移动到对 bind(...)
.
的调用之前
我的扫描器 class 扩展了 Application 并实现了 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
class 运行 有多个实例。一般来说,您不应该手动创建 Android 应用程序 class 的实例(扩展应用程序的实例)。您在 AndroidManifest.xml 中声明这样一个 class,并让 Android OS 在启动应用程序时实例化它。如果您通过调用其构造函数手动实例化 class,则不会调用 onCreate()
方法并且不会创建 beaconManager
。
如果您想从 Activity
中获取此 class 的实例,以便您可以调用 startScan()
或 stopScan()
等方法,您可以使用:
Scanner scanner = (Scanner) this.getApplication();
还要注意代码编写方式的另外两个问题:
如果调用
startScan()
、stopScan()
、startScan()
,第二次startScan()
调用不会发生任何事情,因为beaconManager
会不是零。扫描不会重新启动。调用
beaconManager.updateScanPeriods();
如果之前的异步bind(...);
调用还没有完成(一般不会)就会失败,导致代码落入catch块.一个简单的解决方法是删除对beaconManager.updateScanPeriods();
的调用,只需将beaconManager.setForegroundScanPeriod(period);
调用移动到对bind(...)
. 的调用之前