我可以在 android 上不使用 firebase 中的事件侦听器来获得价值吗?

Can i get value without using event listeners in firebase on android?

我正在使用 Google Firebase 实时数据库的新版本制作一个 Android 应用程序。

当数据 changed/added/deleted/moved 等时,我正在使用 ValueEventListener 和 ChildEventListener 获取我的数据。

现在,我有一个问题。

我的数据是:

"user 1": {
    "name":"abc"
}

我有一个名为 "getName" 的按钮。

我想在单击 getName 按钮时获取用户 1 数据中 "name" 的值。

    getName.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            bla bla..
        }
    });

可能吗? 我可以在不使用监听器的情况下获得价值吗?

我正在等待您的帮助。 谢谢。

是的,您可以使用 addListenerForSingleValueEvent 来做到这一点。与 ValueEventListenerChildEventListener 不同,这将只获取一次值。 所以你的代码看起来像这样,

getName.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
       ref.addListenerForSingleValueEvent(new ValueEventListener() {
       @Override
       public void onDataChange(DataSnapshot snapshot) {
          // do some stuff once
       }
       @Override
       public void onCancelled(FirebaseError firebaseError) {
       }
});

实际上并非如此,每次您更改数据时它都会更改,并且它可能会调用您的所有活动,这是非常无用的,我什至不知道他们为什么这样做……浪费时间。

看看Tasks API framework:

@Override
public void onClick(View view) {
    getUser();
}

private Task<User> getUser(String id) {
    final TaskCompletionSource<User> tcs = new TaskCompletionSource();

    ref.child("users")
        .child(id)
        .addListenerForSingleValueEvent(new ValueEventListener() {

            @Override
            public void onCancelled(FirebaseError error) {
                tcs.setException(error.toException());
            }

            @Override
            public void onDataChange(DataSnapshot snapshot) {
                tcs.setResult(snapshot.getValue(User.class));
            }

        });

    return tcs.getTask();
}

当然,有一种方法可以实现这一点,也许不是你想要的方式。您要做的第一件事是为 'user' 创建一个模型 class,我们称它为 User,它可能是这样的:

package Model;

public class User{

private String name; // make sure this matches the one in Firebase


public String getName() {
    return name;
}

public void setName(String name) {
    this.name= name;
}



public User()
{
    //this non-argument constructor is necessary for Firebase to properly map all the variables.
}

public User(String name) {
    this.name= name;

    }
}

现在在不同的activity,你要访问的用户名。

getName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
   databaseRef.child("users").child("user1").addListenerForSingleValueEvent(new ValueEventListener() {
   @Override
   public void onDataChange(DataSnapshot snapshot) {
      User user = snapshot.getValue(User.class);
      Log.i("user name", user.getName());




   }
   @Override
   public void onCancelled(FirebaseError firebaseError) {
   }
});

如果您的引用指向 'users' 节点并且您想查找具有特定名称的用户并访问其其他属性,您可以这样做。

getName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
   databaseRef.child("users").addListenerForSingleValueEvent(new ValueEventListener() {
   @Override
   public void onDataChange(DataSnapshot snapshot) {
      User user = snapshot.getValue(User.class);
      if(user.getName().equals("abc"))
      {
          Log.i("other data", user.getOtherData());
       }

   }
   @Override
   public void onCancelled(FirebaseError firebaseError) {
   }
});