아래에 표시된대로 Firebase 데이터베이스에 위도와 경도가 저장되어 있습니다 (값이 ""로 묶여 있지 않음).
Latitude: 53.868728
Longitude: -2.941631
이 값을 검색하고 .position ()에 전달하여 내 mapView를 업데이트하려고합니다. 데이터 검색을위한 다른 쿼리가 작동하기 때문에 Firebase 경로가 정확하다는 것을 알고 있습니다. 또한 .position ()에 좌표를 직접 전달하면 올바른 위치가 나타나기 때문에지도 기능이 작동한다는 것도 알고 있습니다. 아래는 앱이 충돌하는 onMapReady 코드이며 logcat에는 유용한 것이 없습니다.
public void onMapReady(GoogleMap googleMap) {
mapView = googleMap;
final Double[] latitude = new Double[1];
final Double[] longitude = new Double[1];
coordinatesDatabase = FirebaseDatabase.getInstance().getReference("Timetable/" + schoolID);
coordinatesDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
latitude[0] = dataSnapshot.child("Latitude").getValue(Double.class);
longitude[0] = dataSnapshot.child("Longitude").getValue(Double.class);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
LatLng schoolLocation = new LatLng(latitude[0], longitude[0]);
mapView.addMarker(new MarkerOptions().position(schoolLocation).title("School"));
mapView.animateCamera(CameraUpdateFactory.newLatLngZoom(schoolLocation, 15.0f));
}
실행에 대한 빨간색 선은 다음과 같습니다.
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.kitchen, PID: 23731
java.lang.NullPointerException: Attempt to invoke virtual method 'double java.lang.Double.doubleValue()' on a null object reference
at com.example.kitchen.SchoolProfile.onMapReady(SchoolProfile.java:378)
at com.google.android.gms.maps.zzak.zza(Unknown Source:2)
at com.google.android.gms.maps.internal.zzaq.dispatchTransaction(Unknown Source:12)
at com.google.android.gms.internal.maps.zzb.onTransact(Unknown Source:12)
at android.os.Binder.transact(Binder.java:675)
at cj.b(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (100408-0):14)
at com.google.android.gms.maps.internal.bb.a(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (100408-0):4)
at com.google.maps.api.android.lib6.impl.bi.run(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (100408-0):2)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:6981)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)
쿼리 결과를 실제로 사용할 수 있기 전에 사용하려고합니다. 실시간 데이터베이스 쿼리는 비동기식이며 쿼리가 실행 addValueEventListener
되기 전에 호출이 즉시 반환됩니다. 즉 ,지도를 채우는 데 사용되는 시점에 latitude
및 longitude
이 null 값을 포함 할 것입니다. 값을 처음 사용할 수있는 콜백으로지도를 처리하는 코드를 이동해야합니다.
coordinatesDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
latitude[0] = dataSnapshot.child("Latitude").getValue(Double.class);
longitude[0] = dataSnapshot.child("Longitude").getValue(Double.class);
// POPULATE THE MAP HERE WITH THE VALUES JUST READ
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다