2017-12-16 25 views
0

내 스캐너 클래스가 응용 프로그램을 확장하고 BeaconConsumer를 구현합니다. BeaconManager를 바인드하거나 바인딩 해제하려고하면 NullPointerException이 발생합니다.메서드 내에서 BeaconManager.bind를 실행할 때 오류가 발생했습니다. ALTBeacon

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 
+0

이 작업을 onCreate() 메서드 내부에서 수행하면 문제가 없습니다. – Timmy

+0

언제'startScan'을 부를까요? beaconManager가 초기화되기 전에 할 수 있을까요? – donfuxx

+0

MainActivity에서 onCreate() 메소드 안에 새 Scanner 객체를 만들고 버튼을 사용하여 startScan을 실행합니다. – Timmy

답변

0

나는 문제가 Scanner 클래스 실행의 여러 인스턴스가 있음을 의심. 일반적으로 Android 애플리케이션 클래스 (Application을 확장하는 클래스)의 인스턴스를 수동으로 생성해서는 안됩니다. AndroidManifest.xml에서 그러한 클래스를 선언하고, Android OS가 앱을 시작할 때이를 인스턴스화하게합니다. 생성자를 호출하여 클래스를 수동으로 인스턴스화하면 onCreate() 메서드가 호출되지 않고 beaconManager이 생성되지 않습니다. 당신은 그래서 당신은 startScan() 또는 stopScan() 같은 메소드를 호출 할 수있는 Activity에서이 클래스의 인스턴스를 얻고 싶다면

당신은 사용할 수 있습니다

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

는의와도, 약 2 다른 문제주의 방법 코드가 기록됩니다

  1. 당신이 startScan()stopScan()startScan()는, 아무것도 01 초에 일어나지 않습니다 호출하는 경우 beaconManager은 0이 아니기 때문에전화가 걸립니다. 스캔이 다시 시작되지 않습니다.

  2. 비동기 bind(...); 호출이 완료되지 전에 호출하면 (보통은 발생하지 않음) 코드가 catch 블록으로 떨어지면 beaconManager.updateScanPeriods();에 대한 호출이 실패합니다. 쉽게 해결할 수있는 전화는 beaconManager.updateScanPeriods();으로 전화를 걸어 전화를 걸어서 bind(...)으로 이동하기 만하면됩니다.

+0

굉장한 답변, 고맙습니다! – Timmy