我可以在Android上的firebase中使用事件监听器获得价值吗?

时间:2016-06-04 10:56:03

标签: android firebase firebase-realtime-database

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

当数据更改/添加/删除/移动等时,我将使用ValueEventListener和ChildEventListener获取数据。

现在,我有一个问题。

我的数据是:

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

我有一个名为“getName”的按钮。

当我点击getName按钮时,我希望在用户1数据中获得“name”的值。

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

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

我在等你的帮助。 谢谢。

4 个答案:

答案 0 :(得分:12)

是的,你可以使用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) {
       }
});

答案 1 :(得分:8)

实际上并非如此,它会在每次更改数据时发生变化,它可能会调用所有非常无用的活动,我甚至不知道为什么他们这样做了......等待时间。

答案 2 :(得分:1)

看看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();
}

答案 3 :(得分:0)

当然,有一种方法可以实现这一点,也许不是你想要的方式。你要做的第一件事是为'用户'创建一个Model类,让我们称之为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;

    }
}

现在在另一个活动中,您想要访问该用户的名称。

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) {
   }
});

如果您的引用指向“用户”节点,并且您希望找到具有特定名称的用户并访问其他属性,则可以执行此操作。

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) {
   }
});