gpt4 book ai didi

android - 无法从 ondatachange 方法中获取值

转载 作者:太空宇宙 更新时间:2023-11-03 11:55:23 24 4
gpt4 key购买 nike

我目前正在开发一个 android 应用程序,我在其中使用 firebase 作为数据库,但是当我在 onDataChange 方法中获取变量并将它们分配给全局变量时,我得到了空变量,但是当我在 onDataChange 中调用这些变量时方法它们不为空。

public class PositionateMarkerTask extends AsyncTask {
public ArrayList<Location> arrayList= new ArrayList<>();
public void connect() {
//setting connexion parameter
final Firebase ref = new Firebase("https://test.firebaseio.com/test");
Query query = ref.orderByChild("longitude");

//get the data from the DB
query.addListenerForSingleValueEvent(new ValueEventListener() {

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//checking if the user exist
if(dataSnapshot.exists()){
for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) {
//get each user which has the target username
Location location =userSnapshot.getValue(Location.class);
arrayList.add(location);
//if the password is true , the data will be storaged in the sharedPreferences file and a Home activity will be launched
}
}
else{
System.out.println("not found");
}
}

@Override
public void onCancelled(FirebaseError firebaseError) {
System.out.println("problem ");

}
});
}

@Override
protected Object doInBackground(Object[] params) {
connect();
return null;
}

@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);

System.out.println("the firs long is"+arrayList.get(0).getLongitude());

}
}

最佳答案

欢迎使用异步编程,它会打乱您一直认为正确的一切。 :-)

Firebase 在后台自动检索/同步数据库。这项工作发生在一个单独的线程上,因此您不需要 AsyncTask。但不幸的是,这也意味着您不能等待数据。

我通常建议您将代码从“先做 A,然后做 B”重新组织为“每当我们得到 A,我们就用它做 B”。

在您的例子中,您想要获取数据然后打印第一项的经度。重构为:每当你收到数据时,打印第一项的经度。

Query query = ref.orderByChild("longitude");

query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) {
Location location =userSnapshot.getValue(Location.class);
arrayList.add(location);
}
System.out.println("the first long is"+arrayList.get(0).getLongitude()); }
else{
System.out.println("not found");
}
}

@Override
public void onCancelled(FirebaseError firebaseError) {
System.out.println("problem ");
}
});

这里有几点需要注意:

  1. 如果您只对第一项感兴趣,则可以将查询限制为一项:query = ref.orderByChild("longitude").limitToFirst(1)。这将检索较少的数据。

  2. 我建议使用 addValueEventListener() 而不是 addListenerForSingleValueEvent()。前者会不断同步数据。这意味着如果您在列表中插入/更改某项的经度,您的代码将自动重新触发并打印(可能)新的第一项。

关于android - 无法从 ondatachange 方法中获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38456650/

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