如何将我的 Firebase 数据库坐标传递给 onMapReady? [关闭]
Posted
技术标签:
【中文标题】如何将我的 Firebase 数据库坐标传递给 onMapReady? [关闭]【英文标题】:How can I pass my Firebase database coordinates to onMapReady? [closed] 【发布时间】:2020-04-18 18:59:55 【问题描述】:我的 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@19831067@19.8.31 (100408-0):14)
at com.google.android.gms.maps.internal.bb.a(:com.google.android.gms.dynamite_mapsdynamite@19831067@19.8.31 (100408-0):4)
at com.google.maps.api.android.lib6.impl.bi.run(:com.google.android.gms.dynamite_mapsdynamite@19831067@19.8.31 (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)
【问题讨论】:
“应用程序崩溃并且 logcat 中没有任何用处” - 这不太可能是真的。至少会有一个堆栈跟踪,其中包含导致崩溃的代码行的一些指示。请编辑问题以显示此堆栈跟踪,以及您如何解释它(告诉我们它所指的代码行)。 @DougStevenson Locat 已附加。我认为没有什么有用的,因为只有前 2 行是红色的。 那里没有堆栈跟踪。你确定你的应用真的“崩溃”了吗?如果它以大多数开发人员使用该词的方式崩溃,则会有一个堆栈跟踪,或者至少有一些错误的迹象。到底发生了什么? @DougStevenson 对不起 - 我添加了额外的信息,看起来确实更有帮助。 那个错误指的是哪一行?那就是你的错误所在。您正在尝试使用 Double 值执行某些操作,但实际上使用的是空值。 【参考方案1】:您正在尝试在查询结果实际可用之前使用它们。实时数据库查询是异步的,在查询完成之前,对addValueEventListener
的调用会立即返回。这意味着latitude
和longitude
在用于填充地图时将包含空值。您应该将处理地图的代码移动到回调中,这是值第一次可用。
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
【讨论】:
以上是关于如何将我的 Firebase 数据库坐标传递给 onMapReady? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何将我的 Firebase 实时数据库转移到 Firebase Cloud Firestore
如何将我的 Firebase 实时数据库转移到 Firebase Cloud Firestore
我无法将我的 v-model 数据传递到我的后端以获取 vue.js 中的单选按钮类型,如何将选中的单选按钮值传递给我的后端?