Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 我如何将我的Firebase数据库坐标传递给OnMaReady?_Android_Firebase_Google Maps_Firebase Realtime Database - Fatal编程技术网

Android 我如何将我的Firebase数据库坐标传递给OnMaReady?

Android 我如何将我的Firebase数据库坐标传递给OnMaReady?,android,firebase,google-maps,firebase-realtime-database,Android,Firebase,Google Maps,Firebase Realtime Database,我将纬度和经度存储在Firebase数据库中,如下所示(请注意,值未封装在“”中): 我正在尝试检索这些值并将其传递给.position(),以更新我的mapView。我知道我的Firebase路径是正确的,因为用于检索数据的其他查询正在工作。我还知道地图功能是有效的,因为如果我将坐标直接传递给.position(),就会显示正确的位置。下面是我的onMapReady代码,应用程序会崩溃,而logcat中没有任何有用的内容: public void onMapReady(GoogleMap g

我将纬度和经度存储在Firebase数据库中,如下所示(请注意,值未封装在“”中):

我正在尝试检索这些值并将其传递给.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)

您试图在查询结果实际可用之前使用它们。实时数据库查询是异步的,在查询完成之前,对
addValueEventListener
的调用会立即返回。这意味着
纬度
经度
在用于填充地图时将包含空值。您应该将处理映射的代码移动到回调中,这是值第一次可用

        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

            }

您试图在查询结果实际可用之前使用它们。实时数据库查询是异步的,在查询完成之前,对
addValueEventListener
的调用会立即返回。这意味着
纬度
经度
在用于填充地图时将包含空值。您应该将处理映射的代码移动到回调中,这是值第一次可用

        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

            }

“应用程序崩溃了,日志中没有任何有用的东西”——这极不可能是真的。至少会有一个堆栈跟踪,其中包含导致崩溃的代码行的一些指示。请编辑问题以显示此堆栈跟踪,以及您如何解释它(告诉我们它所指的代码行)。@DougStevenson Locat附件。我认为没有什么有用的东西,因为只有前两行是红色的,里面没有堆栈跟踪。你确定你的应用程序真的“崩溃”了吗?如果它以大多数开发人员使用该词的方式崩溃,那么将有一个堆栈跟踪,或者至少有一些错误指示。到底发生了什么?@DougStevenson啊,对不起-我添加了额外的信息,看起来确实更有用。那个错误指的是哪一行?这就是你的错误所在。你试图用一个双倍值做一些事情,但实际使用的是一个空值。“应用程序崩溃了,logcat中没有任何有用的东西”-这极不可能是真的。至少会有一个堆栈跟踪,其中包含导致崩溃的代码行的一些指示。请编辑问题以显示此堆栈跟踪,以及您如何解释它(告诉我们它所指的代码行)。@DougStevenson Locat附件。我认为没有什么有用的东西,因为只有前两行是红色的,里面没有堆栈跟踪。你确定你的应用程序真的“崩溃”了吗?如果它以大多数开发人员使用该词的方式崩溃,那么将有一个堆栈跟踪,或者至少有一些错误指示。到底发生了什么?@DougStevenson啊,对不起-我添加了额外的信息,看起来确实更有用。那个错误指的是哪一行?这就是你的错误所在。您试图使用双精度值执行某些操作,但实际使用的是空值。