Java 尝试填充列表时使用Firebase-NullPointerException的Android
我得到一个空指针异常(这里测试的是1而不是I) 这就是方法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
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
}
});