【问题标题】:java.lang.IndexOutOfBoundsException ERROR don't know how to solve [duplicate]java.lang.IndexOutOfBoundsException ERROR不知道怎么解决[重复]
【发布时间】:2020-01-29 10:18:32
【问题描述】:

我正在开发一个地图应用程序,但是当我尝试从 Firebase 获取 latlng 时不断收到此错误,我不明白,也不知道如何解决。

错误:

java.lang.IndexOutOfBoundsException: 无效索引 0,大小为 0 在 java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 在 java.util.ArrayList.get(ArrayList.java:308) 在 fr.divdev.maphadev.MapsActivity.initMarkers(MapsActivity.java:120) 在 fr.divdev.maphadev.MapsActivity.onMapReady(MapsActivity.java:74) 在 com.google.android.gms.maps.zzak.zza(未知来源) 在 com.google.android.gms.maps.internal.zzaq.dispatchTransaction(未知 资源) 在 com.google.android.gms.internal.maps.zzb.onTransact(未知 来源)

getLocationList() 代码:

public List < Location > getLocationList() {
    final List < Location > list = new ArrayList < > ();
    DatabaseReference f_database = FirebaseDatabase.getInstance().getReference().child("location");
    f_database.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot child:
                dataSnapshot.child("Loisir").child("lieu").child("latlng").getChildren()) {
                double lat = Double.parseDouble(child.child("latitude").getValue().toString());
                double lng = Double.parseDouble(child.child("longitude").getValue().toString());
                list.add(new Location("location", new LatLng(lat, lng)));
                Log.e("erreur", "********");
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
    return list;
}

【问题讨论】:

  • 哪一行有例外?
  • 显示第 255 行。
  • 这不是您的异常代码,因为您没有在此函数中访问您的列表。当您从函数 getLocationList 访问返回的列表时会出现此异常
  • 第 255 行是 ArrayList.class....
  • 私有 void fastRemove(int var1) { ++this.modCount; int var2 = this.size - var1 - 1; if (var2 > 0) { System.arraycopy(this.elementData, var1 + 1, this.elementData, var1, var2); }

标签: android firebase google-maps firebase-realtime-database


【解决方案1】:

添加监听器后,由于firebase需要使用网络获取数据,这个过程需要时间。因此,您不能创建一个从远程机器中的 firebase db 获取的函数并期望它返回完整的数据。可以在onDataChange()里面调用getLocationList()后面需要调用的函数

public void getLocationList() {
    DatabaseReference f_database = FirebaseDatabase.getInstance().getReference().child("location");
    f_database.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            List < Location > list = new ArrayList < > ();
            for (DataSnapshot child:
                dataSnapshot.child("Loisir").child("lieu").child("latlng").getChildren()) {
                double lat = Double.parseDouble(child.child("latitude").getValue().toString());
                double lng = Double.parseDouble(child.child("longitude").getValue().toString());
                list.add(new Location("location", new LatLng(lat, lng)));
                Log.e("erreur", "********");
            }
            someFunction(list);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
}

或者你也可以试试onComplete()或者onSuccess()等方法。

作为提示,与其稍后侦听"location" 节点和childing,不如侦听所需节点本身更有效。

DatabaseReference f_database = FirebaseDatabase.getInstance().getReference().child("location");

DatabaseReference f_database = FirebaseDatabase.getInstance().getReference().child("location").child("Loisir").child("lieu").child("latlng");

然后

for (DataSnapshot child: dataSnapshot.child("Loisir").child("lieu").child("latlng").getChildren()) {

for (DataSnapshot child: dataSnapshot.getChildren()) {
...
}

【讨论】:

    【解决方案2】:

    函数返回的列表是空的,因为firebase api调用是异步的,因此返回列表;在 api 获取数据之前执行。

    移动返回列表;在 for 循环外的 onDataChange 函数内,您将获得数据。现在为了获取异步数据,尝试使用 asynctask 或创建一个接口来返回数据。 希望这会有所帮助。

    【讨论】:

    • 那么函数将需要其他东西才能返回,因为 forloop 没有执行。因此return list; 内的onDataChange() 永远不会被调用
    • 这就是为什么我提到使用 asyntask 或制作一个接口来进行网络调用。请再读一遍。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2022-10-15
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    相关资源
    最近更新 更多