为什么这个方法在另一个方法完成之前运行?

时间:2018-04-18 21:03:13

标签: java android android-activity

我是Android编程的新手。我正在构建一个简单的应用程序,我有一个" follow-unfollow"对它的概念。我只想要的是,如果当前用户跟随他/她正在探索的用户,我希望他/她看到"取消关注"按钮。如果不遵循,应该有"关注"按钮。在我的UserProfileActivity类中,我有一个名为onPrepareOptionsMenu()的方法,在这个方法中我可以设置按钮。

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem follow = menu.findItem(R.id.action_follow);
    MenuItem unfollow = menu.findItem(R.id.action_unfollow);
    Bundle bundle = this.getIntent().getExtras();
    if(isFollowing(bundle.getString("userid")) == true){
        follow.setVisible(false);
        unfollow.setVisible(true);
    }
    else{
        follow.setVisible(true);
        unfollow.setVisible(false);
    }
    return super.onPrepareOptionsMenu(menu);
}

另外,我有另一个名为isFollowing()的方法,它返回一个布尔值" true"如果当前用户跟随另一个用户,则返回" false"如果不。这是我想解决这个问题最简单的方法。

    public boolean isFollowing(String userID){
    isFollowingResult = false;

    firebaseDatabase = FirebaseDatabase.getInstance();
    databaseReference = firebaseDatabase.getReference();
    final DatabaseReference followingData = databaseReference.child("followingData");

    followingData.child(currentUser.getUid()).child(userID).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if(dataSnapshot.exists())
                isFollowingResult = true;
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    return isFollowingResult;
}

当我运行它时,当我点击用户的配置文件时,onPrepareOptionsMenu()方法被调用,并在其中调用isFollowing()方法。问题是,它不等待isFollowing()方法运行并完成运行,它立即将其视为" false"并始终显示"关注"按钮。任何建议都将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:1)

代码存在多个问题。

首先,您的isFollowing()函数正在数据字段上设置侦听器,但只有在数据更改时才会调用它。在这种情况下,您可能只想读取一次数据: https://firebase.google.com/docs/database/android/read-and-write#read_data_once

其次,使用听众意味着异步性。这意味着,您需要等到稍后获得回调才能获得所需的值。

为了保持应用程序的响应能力,理想的解决方案是使用不断更新该值的侦听器维护数据库中值的本地“副本”。这样,您可以快速查询变量的状态(因为它在本地存储/复制),并且仍然与您的数据库(与监听器)保持同步。

这也可以防止每次“读取”一直进入服务并返回,同时也消除了UI等待正确(准确)呈现的需要。

答案 1 :(得分:1)

followunfollow字段设为。然后在onDataChange(DataSnapshot)方法中更改其可见性。