gpt4 book ai didi

java - Android with Firebase - 尝试填充列表时出现 NullPointerException

转载 作者:行者123 更新时间:2023-12-01 08:46:18 26 4
gpt4 key购买 nike

我收到一个空指针异常(这里测试了 1 而不是 i)

这就是方法

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

}

这是在单独的 Activity 中调用它的地方

 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);

在像这样的其他 Activity 中使用它没有问题

arrayLat = I.getStringArrayListExtra("arrayLat");

尽管我在下一个 Activity 中使用的值是存储值,并且当我在 firebase 中的信息(纬度)发生变化时不会更新。

谢谢

最佳答案

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

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());

}
});

您正在 onDataChange(DataSnapshot snapshot) 内填充 arrayLat

因此,事实是,由于这是一个回调,因此即使在触发监听器并填充 arrayLat 之前也会调用 arrayLat.get(i) 行。希望你明白了。有几种方法可以解决这个问题。您可以创建另一个接口(interface)来处理回调,也可以直接在回调中编写代码。我只会写一个简单的解决方案。将您的代码更改为此。首先创建一个接口(interface),

public interface SnapshotListener{
void onListFilled(ArrayList<String> arrayLat);
void onFailure();
}
public void getLat(int i, SnapshotListener listener) {
fillDriverList(listener);
//arrayLat.get(i);
//return"0.000";

}

现在将其他方法更改为此。

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
}
});

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

关于java - Android with Firebase - 尝试填充列表时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43025268/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com