Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.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
Java 尝试填充列表时使用Firebase-NullPointerException的Android_Java_Android_Android Studio_Firebase_Firebase Realtime Database - Fatal编程技术网

Java 尝试填充列表时使用Firebase-NullPointerException的Android

Java 尝试填充列表时使用Firebase-NullPointerException的Android,java,android,android-studio,firebase,firebase-realtime-database,Java,Android,Android Studio,Firebase,Firebase Realtime Database,我得到一个空指针异常(这里测试的是1而不是I) 这就是方法 public String getLat(int i) { fillDriverList(); arrayLat.get(i); return"0.000"; } 这是在单独的活动中调用它的地方 AdminActivity appState = new AdminActivity(); latString = appState.getLa

我得到一个空指针异常(这里测试的是1而不是I)

这就是方法

   public String getLat(int i) {
        fillDriverList();
        arrayLat.get(i);
        return"0.000";

    }
这是在单独的活动中调用它的地方

 AdminActivity appState = new AdminActivity();
                latString = appState.getLat(i);
这里是fill方法,它正在打印驱动程序名称,因此似乎正在填充列表,但由于某种原因,在我的getLat方法中为null

public void fillDriverList() {

        //Creating firebase object
        Firebase ref = new Firebase(Config.FIREBASE_URL);   

        //adding a value event listener so if data in database changes it does in textview also not needed at the minute
        ref.child("Driver").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                arrayLat = new ArrayList<String>();

                for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                    Driver d = postSnapshot.getValue(Driver.class);

                    System.out.println("data snapshot Drivers name is -------------------> "+d.getName());

                    arrayLat.add(Double.toString(d.getLat()));


                }

            }

            /************had to implement this method****************/
            @Override
            public void onCancelled(FirebaseError firebaseError) {
                System.out.println("The read failed: " + firebaseError.getMessage());

            }
        }); 

    }
在其他类似的活动中使用它是没有问题的

intent.putStringArrayListExtra("arrayLat", arrayLat);
arrayLat = I.getStringArrayListExtra("arrayLat");
尽管我在下一个活动中使用的值是存储值,并且在firebase中的信息(纬度)更改时不会更新


谢谢

驱动程序对象必须检查它

            for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                Driver d = postSnapshot.getValue(Driver.class);
                if(d!=null ){
                    arrayLat.add(Double.toString(d.getLat()));
                }
            }

肉眼可见的问题是,列表正在侦听器或回调中填充,而您将整个事情视为同步的。 看这边

ref.child("Driver").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                arrayLat = new ArrayList<String>();

                for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                    Driver d = postSnapshot.getValue(Driver.class);

                    System.out.println("data snapshot Drivers name is -------------------> "+d.getName());

                    arrayLat.add(Double.toString(d.getLat()));


                }

            }

            /************had to implement this method****************/
            @Override
            public void onCancelled(FirebaseError firebaseError) {
                System.out.println("The read failed: " + firebaseError.getMessage());

            }
        }); 
对此

appState.getLat(i, new SnapshotListener{
  public void onListFilled(ArrayList<String> arrayLat){
    AdminActivity appState = new AdminActivity();
                    latString = arrayLat;
}
    public void onFailure(){
     //go crazy
}
});
appState.getLat(i,新SnapshotListener){
仅填写公共空白(ArrayList Arrayla){
AdminActivity appState=新的AdminActivity();
latString=Arrayla;
}
公共失效(){
//发疯
}
});

代码是直接用SO编写的,因此可能会有一些语法错误。

您所说的似乎很有道理,感谢您的回答,我一直坚持到现在。但是代码中出现了一些错误。几个问题。错误出现在您给我的代码的最后一部分,我正在创建appState。在调用appState.getLat()之前,我需要创建appState,我还需要将新的SnapshotListener更改为Admin.SnapshotListener,或者我需要在单独的类中创建接口吗;但是一个是字符串,一个是数组,所以我猜你是指arrayla.get(i)?但是这个方法不返回任何东西,如果我让它返回一些它仍然不工作的东西,那么我遗漏了latString是一个字符串。是的,您必须使用latString=arrayla.get(i)。不需要单独上课。您可以这样做,但如果您只是在类中的任何位置创建它,它就会起作用。我不知道您的父类名称,如果它是Admin,那么当然是Admin.SnapshotChangeListener。因为整个过程都是基于回调的,也就是说,您依赖于一个单独的线程来完成它,所以您不能返回一些东西。通过适当的代码结构,您将不需要它。如果函数返回某些内容,它必须是同步的。你明白我的意思了吗?是的,我想我明白,基本上是因为填充数组需要时间,它是异步完成的,所以我不能调用sync(即时?)调用来检索数组,我也需要异步执行,并完成使用数组进行异步所需的任何操作?我想我现在可以用了,非常感谢
public void fillDriverList(SnapshotListener listener) {

        //Creating firebase object
        Firebase ref = new Firebase(Config.FIREBASE_URL);   

        //adding a value event listener so if data in database changes it does in textview also not needed at the minute
        ref.child("Driver").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                arrayLat = new ArrayList<String>();

                for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                    Driver d = postSnapshot.getValue(Driver.class);

                    System.out.println("data snapshot Drivers name is -------------------> "+d.getName());

                    arrayLat.add(Double.toString(d.getLat()));


                }
                if(listener != null){
                    listener.onListFilled(arrayLat);
                }

            }

            /************had to implement this method****************/
            @Override
            public void onCancelled(FirebaseError firebaseError) {
                System.out.println("The read failed: " + firebaseError.getMessage());
             if(listener != null){
                    listener.onFailure();
                }
            }
        }); 

    }
AdminActivity appState = new AdminActivity();
                latString = appState.getLat(i);
appState.getLat(i, new SnapshotListener{
  public void onListFilled(ArrayList<String> arrayLat){
    AdminActivity appState = new AdminActivity();
                    latString = arrayLat;
}
    public void onFailure(){
     //go crazy
}
});