2017-01-16 6 views
0

Firebase 데이터베이스에서 데이터를 읽은 다음 해당 항목에서 배열을 만들고 해당 배열 목록의 마커가있는지도를 만들려고합니다. 나는이 예외가 활동 실행하려고하면onDataChange 메소드 내부에서 작업하기 Android Firebase 데이터베이스

는하지만 :

java.lang.NullPointerException: Attempt to invoke virtual method 
'com.google.android.gms.maps.model.Marker 
com.google.android.gms.maps.GoogleMap.addMarker(com.google.android.gms.maps.model.MarkerOptions)' 
on a null object reference 

을 여기 내 코드입니다. 이해를 돕기 위해 의견을 읽으십시오.

 mLocationDatabaseReference.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      for (DataSnapshot dsp : dataSnapshot.getChildren()) { 
       LocationCurrent post = dsp.getValue(LocationCurrent.class); 
       Double latitude = Double.parseDouble(post.getLatitude()); 
       Double longitude = Double.parseDouble(post.getLongitude()); 
       currentLocationLatLng = new LatLng(latitude, longitude); 
       latlngs.add(currentLocationLatLng); 


       //Logging works fine I see all items of the latlngs array 
       Log.i("LAT LONGS IN", String.valueOf(latlngs)); 

       //Same Exception points here 
       for(int i = 0 ; i < latlngs.size() ; i++) { 

        createMarker(latlngs.get(i)); 
       } 

      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 


    MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map); 
    mapFragment.getMapAsync(this); 
} 


@Override 
public void onMapReady(GoogleMap googleMap) { 

} 
//Exception points here too 
protected Marker createMarker(LatLng latlngmthd) { 

    return mMap.addMarker(new MarkerOptions() 
      .position(latlngmthd) 
      .anchor(0.5f, 0.5f)); 
} 

제 생각에는 onDataChange 메소드 내부의 데이터로 작업해야하지만 예외에서 볼 수 있듯이 맵 객체는 거기에 생성되지 않습니다. onDataChange에서 onMapReady를 이동할 수 없습니다. 그래서 누구나지도 객체를 만들고 onDataChange 메서드 안의 마커로 채울 수있는 방법에 대한 제안을 알고 있습니까?

답변

0

nMap이 제대로 초기화되지 않았으며 null 인 것으로 보입니다. 올린 onMapReady() 메서드는 비어 있습니다. 지도가 사용될 준비가되면이 메소드가 호출됩니다. 지도 객체를 캡처하는 문을 포함해야합니다. 맵이 준비 될 때까지 리스너를 추가하지 않아야합니다. 다음과 같이 같은 방법으로 이동할 수 있습니다.

@Override 
public void onMapReady(GoogleMap googleMap) { 
    nMap = googleMap; 
    mLocationDatabaseReference.addListenerForSingleValueEvent(...); 
} 
관련 문제