首页 > 解决方案 > 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) {
                   }
               });

标签: javaandroidfirebasefirebase-realtime-database

解决方案


推荐阅读