java - Firebase ListenerForSingleValueEvent 未触发 onCreate 而是 onResume()
问题描述
所以我有一个 MainActivity ,它应该在运行 onCreate 方法时从 Firebase 调出一组数据,但是,List 每次都返回 0。
值得注意的是,当我转到另一个活动(暂停 MainActivity)然后在返回 MainActivity 时调用 onResume(),该方法运行良好,返回所需的结果.....我怀疑这与活动生命周期有关,但可以'似乎没有固定下来。
将方法放在 onCreate()、onStart() 和 onResume() 中具有相同的结果 0,并且在导航到另一个活动并返回给我数据方面具有相同的行为。
有什么想法吗?
我的 onResume() 方法:
@Override
protected void onResume() {
super.onResume();
if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},REQUEST_LOCATION);
}
else if (ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_EXTERNAL);
}
try{
mFusedLocationClient.getLastLocation().addOnSuccessListener(this, new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
FirebaseAuth auth = FirebaseAuth.getInstance();
double lattitude = location.getLatitude();
double longitude = location.getLongitude();
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("GeoFire");
GeoFire geofire = new GeoFire(ref);
geofire.setLocation(auth.getUid(), new GeoLocation(lattitude, longitude), new GeoFire.CompletionListener() {
@Override
public void onComplete(String key, DatabaseError error) {
if (error != null) {
System.err.println("There was an error saving the location to GeoFire: " + error);
} else {
System.out.println("Location saved on server successfully!");
}
}
});
}
});}
catch (SecurityException e){
}
generateData();
}
mFusedLocationClient 是 FusedLocationProvierClient 类的一个实例。文档可以在这里找到。
生成数据方法:
userDb.orderByChild("aField").equalTo(constraint).limitToLast(50).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
getUserList(); // runs geolocation
//GENERATE LIST
for (DataSnapshot ds : dataSnapshot.getChildren()) {
try {
User tempUser = ds.getValue(User.class);
userList.add(tempUser);
setActive(userList);
}
Log.d("userListSize", String.valueOf(userList.size()));
} catch (IndexOutOfBoundsException e) {
Log.d("Index EXception", e.getMessage());
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
解决方案
推荐阅读
- apache-nifi - Nifi 流不运行并显示活动线程消息
- windows - 笔记本中的非 ASCII 字符
- android - 如何摆脱这个错误,exoplayer 与我的应用程序发生冲突
- python - Python Tkinter Entry.get() 给出了先前的输入
- spring-boot - 在 Spring Boot 的运行时更改值
- flutter - Flutter 如何在行中添加文本字段和单选按钮?
- java - C#.net 到 Java- 使用带有密码的 AES 进行加密和解密
- r - 字云 R 工作室 strwidth 中的错误(words[i],cex = size[i],...):无效的 'cex' 值
- typescript - 为什么允许具有不同交集类型参数的接口方法实现?
- asp.net - 在没有自动回发的情况下更改下拉列表值