2016-08-05 5 views
0

모니터링이라는 버튼이있는 mainActivity가 있습니다. 버튼을 누르면 근처의 표지가 나타납니다. 버튼을 누르면 응용 프로그램이 작동하지 않는다는 오류 메시지가 나타납니다.ListAdapter가 작동하지 않습니다.

public class MonitoringBeacons extends AppCompatActivity { 

    private ProximityManagerContract proximityManager; 

    ListAdapter beaconsAdapter; 
    ListView listView; 
    List<String> beaconsList = new ArrayList<String>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_monitoring_beacons); 
     KontaktSDK.initialize("kasjdhioasjkdoasdjo"); 

     proximityManager = new ProximityManager(this); 
     proximityManager.setEddystoneListener(createEddystoneListener()); 

     setAdapter(); 


     listView.setOnItemClickListener(
       new AdapterView.OnItemClickListener() { 
        @Override 
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { 
         String beacon = String.valueOf(adapterView.getItemAtPosition(position)); 
         Toast.makeText(MonitoringBeacons.this, beacon, Toast.LENGTH_SHORT).show(); 
        } 
       } 
     ); 
    } 

    protected void setAdapter() { 
     if(beaconsList.isEmpty()) { 
      Toast.makeText(MonitoringBeacons.this, "No beacons found", Toast.LENGTH_SHORT).show(); 
      return ; 
     } 
     beaconsAdapter = new CustomListAdapter(this, beaconsList); 
     listView = (ListView) findViewById(R.id.listView); 
     listView.setAdapter(beaconsAdapter); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     startScanning(); 
    } 

    @Override 
    protected void onStop() { 
     proximityManager.stopScanning(); 
     super.onStop(); 
    } 

    @Override 
    protected void onDestroy() { 
     proximityManager.disconnect(); 
     proximityManager = null; 
     super.onDestroy(); 
    } 

    private void startScanning() { 
     proximityManager.connect(new OnServiceReadyListener() { 
      @Override 
      public void onServiceReady() { 
       proximityManager.startScanning(); 
      } 
     }); 
    } 

    private EddystoneListener createEddystoneListener() { 
     return new SimpleEddystoneListener() { 
      @Override 
      public void onEddystoneDiscovered(IEddystoneDevice eddystone, IEddystoneNamespace namespace) { 
       beaconsList.add(eddystone.getUniqueId()); 
       setAdapter(); 
      } 

      @Override 
      public void onEddystoneLost(IEddystoneDevice eddystone, IEddystoneNamespace namespace) { 
       beaconsList.remove(eddystone.getUniqueId()); 
       setAdapter(); 
      } 
     }; 
    } 

} 

및 CustomListAdapter의 코드 :

public class CustomListAdapter extends BaseAdapter { 

    private List<String> beaconsList; 
    private Activity activity; 
    private LayoutInflater inflater; 

    public CustomListAdapter(Activity activity, List<String> beaconsList) { 
     this.activity = activity; 
     this.beaconsList = beaconsList; 
    } 

    @Override 
    public int getCount() { 
     return beaconsList.size(); 
    } 

    @Override 
    public Object getItem(int location) { 
     return beaconsList.get(location); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (inflater == null) 
      inflater = (LayoutInflater) activity 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     if (convertView == null) 
      convertView = inflater.inflate(R.layout.custom_row, null); 

     String singleBeaconItem = String.valueOf(getItem(position)); 
     TextView beaconText = (TextView) convertView.findViewById(R.id.BeaconText); 
     ImageView beaconImage = (ImageView) convertView.findViewById(R.id.BeaconImage); 

     beaconText.setText(singleBeaconItem); 
     beaconImage.setImageResource(R.drawable.tough_beacon_1); 

     return convertView; 
    } 
} 

나는 근처의 비콘 목록으로 출연한다 버튼을 누를 때 이상적으로 비콘이 때 다음 버튼 활동의 코드는 자동으로 업데이트되어야하는 목록을 발견하거나 잃었습니다. 02 :

는 --------- 로그 캣

에 충돌 의 시작 08-06 (17)

스택 추적 편집 15.276 2559년에서 2559년까지/com.example.panagiotis합니다. beaconsproject E/AndroidRuntime : 치명적인 예외 : 주 프로세스 : com.example.panagiotis.beaconsproject, PID : 2559 java.lang.RuntimeException : 활동을 시작할 수 없습니다. ComponentInfo {com.example.panagiotis.beaconsproject/com.example.panagiotis. beaconsproject.MonitoringBeacons} : java.lang.NullPointerException : 호출을 시도합니다. 가상 메소드 'null void reference android.app.ActivityThread에서 android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2416) 의 null 객체 참조에 대한'android.widget.ListView.setOnItemClickListener (android.widget.AdapterView $ OnItemClickListener) '를 호출하십시오. android.os.Handler.dispatchMessage에서 android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1344) 에서 android.app.ActivityThread.-wrap11에서 handleLaunchActivity (ActivityThread.java:2476) (ActivityThread.java) (Handler.java:102) android.os.Looper.loop (Looper.java:148) android.app.ActivityThread.main (ActivityThread.java:5417) (네이티브 메소드) com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main (java.lang.reflect.Method.invoke) ZygoteInit.java:616) 에 의해 발생 : java.lang.NullPointerException : 널 객체 참조에 대한 가상 메소드 'void android.widget.ListOutlook.setOnItemClickListener (android.widget.AdapterView $ OnItemClickListener)'호출 시도 at com.example .panagiotis.beaconsproject.MonitoringBeacons.onCreate (MonitoringBeacons.java:44) android.app.Activity.performCreate (Activity.java:6237)에서 android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1107)로이드에서 android.app.ActivityThread.-wrap11에서 android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2476) 에서 android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2369) (ActivityThread.java) 에 3,691,363,210 .app.ActivityThread $ H.handleMessage (ActivityThread.java:1344) android.os.Handler.dispatchMessage (Handler.java:102)에서 at android.os.Looper.loop (Looper.java:148) at android .app.ActivityThread.main (ActivityThread.java:5417) at java.lang.reflect.Method.invoke (기본 메소드) at com.android.internal.os.ZygoteInit $ M ethodAndArgsCaller.실행 (ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:616) 08-06 17 : 02 : 18.087 2559-2559/com.example.panagiotis.beaconsproject I/프로세스 : 신호를 보냅니다. PID : 2559 SIG : 9 08-06 17 : 02 : 22.298 3433-3433/com.example.panagiotis.beaconsproject W/System : 알 수없는 경로로 참조 된 ClassLoader : /data/app/com.example.panagiotis.beaconsproject-1/ lib/x86 08-06 17 : 02 : 22.455 3433-3433/com.example.panagiotis.beaconsproject W/System : 알 수없는 경로로 참조 된 ClassLoader : /data/app/com.example.panagiotis.beaconsproject-1/lib/x86 08-06 17 : 02 : 22.604 3433-3433/com.example.panagiotis.beaconsproject W/art : Android 4.1 이전 버전에서 메소드 android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter (android.graphics. PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff $ Mode)는 android.graphics.drawable.Drawable 08-06 17 : 02 : 22.715 3433-3460/com의 package-private 메소드를 잘못 재정의했습니다. 예제 .panagiotis.beaconsproject D/OpenGLRenderer : Use E GL_SWAP_BEHAVIOR_PRESERVED : 사실
[08-06 17 : 02 : 22.718 3433 : 3433 D /] HostConnection : 수() 새로운 호스트 연결 0xaa9a71c0 설립, TID 3433
[08-06 17 : 02 : 22.754 3433 : 3460 D /] HostConnection :: get() 새 호스트 연결이 설정 됨 0xaa9a6920, tid 3460 08-06 17 : 02 : 22.768 3433-3460/com.example.panagiotis.beaconsproject I/OpenGLRenderer : 초기화 된 EGL, 버전 1.4 08-06 17 : 02 : 24.070 3433-3460/com.example.panagiotis.beaconsproject E/Surface : getSlotFromBufferLocked : 알 수없는 버퍼 : 0xaa9b17f0 08-06 17 : 02 : 26.685 3433-3433/com.example.panagiotis.beaconsproject W/ViewRootImpl : 창 포커스가 없어서 이벤트 취소 : 모션 이벤트 타입 {0} = TOOL_TYPE_FINGER, buttonState = 0, metaState = 0, flags = 0x0, edgeFlags = 0x0, pointerCount = 1, historySize = 0, eventTime = 70853, downTime = 67680, deviceId = 0, source = 0x1002} 08-06 17 : 02 : 26.685 3433-3433/com.example.panagiotis.beaconsproject W/ViewRootImpl : 윈도우 포커스가 없기 때문에 이벤트 취소 : MotionEvent {action = ACTION_CANCEL, actionButton = 0, id [0] = 0, x [0] = 397.5, y [0] = 956.6797, toolType [0] = TOOL_TYPE_FINGER, buttonState = 0, metaState = 0, flags = 0x0, edgeFlags = 0x0, pointerCount = 1, historySize = 0, eventTime = 70853, downTime = 67680, deviceId = 0, source = 0x1002 08-06 17 : 02 : 26.686 3433-3433 /com.example.panagiotis.beaconsproject W/ViewRootImpl : 창 포커스가 없어서 이벤트 취소 : MotionEvent {action = ACTION_CANCEL, actionButton = 0, id [0] = 0, x [0] = 397.5, y [0] = 956.6797 , toolType [0] = TOOL_TYPE_FINGER, buttonState = 0, metaState = 0, flags = 0x0, edgeFlags = 0x0, pointerCount = 1, historySize = 0, eventTime = 70853, downTime = 67680, deviceId = 0, source = 0x1002} 08-06 17 : 02 : 26.686 3433-3433/com.example.panagiotis.beaconsproject W/ViewRootImpl : 윈도우 포커스가 없기 때문에 이벤트 취소 : MotionEvent {action = ACTION_CANCEL, actionButton = 0, id [0] = 0, x [0] = 397.5, y [0] = 956.6797, toolType [0] = TOOL_TYPE_FINGER, buttonState = 0 , metaState = 0, flags = 0x0, edgeFlags = 0x0, pointerCount = 1, historySize = 0, eventTime = 70853, downTime = 67680, deviceId = 0, source = 0x1002 08-06 17 : 02 : 28.817 3433-3460/com.example.panagiotis.beaconsproject E/Surface : getSlotFromBufferLocked : 알 수없는 버퍼 : 0xaa9b17f0 08-06 17 : 02 : 29.373 3433-3460/com.example.panagiotis.beaconsproject E/Surface : getSlotFromBufferLocked : 알 수없는 버퍼 : 0xb40938f0 08- 06 17 : 02 : 29.375 3433-3460/com.example.panagiotis.beaconsproject D/OpenGLRenderer : endAllStagingAnimators on 0xa1d53580 (Rip pleDrawable) 0xa203f910 08-06 17 : 02 : 30.806 3433-3460/com.example.panagiotis.beaconsproject E/Surface : getSlotFromBufferLocked : 알 수없는 버퍼 : 0xb4094e60 08-06 17 : 02 : 32.811 3433-3460/com. example.panagiotis.beaconsproject E/Surface : getSlotFromBufferLocked : 알 수없는 버퍼 : 0xb40938f0 08-06 17 : 02 : 35.874 3433-3433/com.example.panagiotis.beaconsproject D/AndroidRuntime : VM 종료 중 08-06 17:02 : 35.874 3433-3433/com.example.panagiotis.beaconsproject E/AndroidRuntime : 치명적인 예외 : 주 프로세스 : com.example.panagiotis.beaconsproject, PID : 3433 java.lang.RuntimeException : 활동을 시작할 수 없습니다. ComponentInfo {com.example.panagiotis.beaconsproject/com.example.panagiotis.beaconsproject.MonitoringBeacons} : java.lang.NullPointerException : 가상 메소드 'void를 호출하려고합니다. android.app.ActivityThread.handleLaunchActivity (ActivityThread에서 android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2416) 에서 널 객체 참조 에 android.widget.ListView.setOnItemClickListener (android.widget.AdapterView $ OnItemClickListener) '. java : 2476) android.app.ActivityThread.-wrap11 (ActivityThread.java) android.app.ActivityThread에서 $ H.handleMessage (ActivityThread.java:1344) andro에서 id.os.Handler.dispatchMessage (Handler.java:102) (android.os.Looper.loop (Looper.java:148) android.app.ActivityThread.main (ActivityThread.java:5417) at java. com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:726) 에서 lang.reflect.Method.invoke : 616) 원인 : java.lang.NullPointerException : com.example.panagiotis의 null 객체 참조 에서 'android.widget.ListView.setOnItemClickListener (android.widget.AdapterView $ OnItemClickListener)'가상 메소드를 호출하려고 시도했습니다. beaconsproject.MonitoringBeacons.onCreate (M onitoringBeacons.java:44) android.app.Activity.performCreate (Activity.java:6237) android.app.ActivityThread.performLaunchActivity에서 android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1107) 에서 (ActivityThread에서 . 자바 : 2369) android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2476에서 ) android.app.ActivityThread.-wrap11 android.app.ActivityThread $ H.handleMessage에서 (ActivityThread.java) 에서 (ActivityThread.java : 1344) android.os.Handler.dispatchMessage (Handler.java:102)에서 android.os.Looper.loop (Looper.java:148) android.app.ActivityThread.main (ActivityThread.java:5417) at java.lang.reflect.Method.invoke (기본 메소드) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java : 726) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:616) 08-06 17 : 02 : 39.204 3433-3433/com.example.panagiotis.beaconsproject I/Process : 보내는 신호. PID : 3433 SIG : 9

아이디어가 있으십니까?

+0

응용 프로그램이 충돌하면 LogCat에 스택 추적이 있어야합니다. 이 질문을 귀하의 질문에 추가 할 수 있습니까? – davidgyoung

+0

@davidgyoung 나는 그것을 더했다. –

답변

0

stacktrace가 무슨 일이 일어나는지 설명합니다.

코드 행 실행

: 그것은 널되도록

listView.setOnItemClickListener(... 

listView 아직 초기화되지 않았다. 이로 인해 NullPointerException이 발생합니다.

해당 변수는 setAdapter() 메서드에서 초기화되지만 beaconsList.isEmpty()이 true로 평가되면 메서드가 빨리 끝나기 때문에 변수가 초기화되지 않을 수 있습니다.

간단한 해결책은 listView을 초기화하는 코드를 해당 메서드의 맨 위로 이동하는 것입니다.