我正在尝试使用他的UID获取特定用户的用户详细信息。我需要一个方法,可以将userName作为String类型返回,以便我可以存储它并在我的应用程序中显示它。
getUserName("UID");
这是我试过的 -
private String getUserName(String startedBy) {
mProfileRef=database.getReference("Profile").child(startedBy).child("UserDetails").child("userName");
mProfileRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
userName = dataSnapshot.getValue(String.class);
Log.i(TAG, "onDataChange: "+userName);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return userName;
}
Log语句完美执行,并根据UID提供正确的userName。该方法不返回userName。它返回null。如何返回userName?
答案 0 :(得分:3)
这是因为onDataChange
操作是异步执行的。这意味着方法Firebase
在后台线程上执行,同时您的UI线程执行原始方法并返回值而不等待public interface OnDataLoaded {
onDataLoaded(String username);
}
响应。
可以使用界面完成解决方案。
1 - 定义界面
public void getUserName(String startedBy, OnDataLoaded onDataLoaded)
2 - 将界面作为方法参数
传递mProfileRef = database.getReference("Profile").child(startedBy).child("UserDetails").child("userName");
mProfileRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
userName = dataSnapshot.getValue(String.class);
onDataLoaded.onDataLoaded(username);
Log.i(TAG, "onDataChange: "+userName);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
3 - 使用界面传递用户名。
public class yourActivity implements OnDataLoaded
4 - 使用您的活动/片段中的界面。
@Override
public void onDataLoaded(String userName) {
// your userName will be available here.
// you can use your bindings here.
}
5 - 您的控件将转移到您的活动方法onDataLoaded
results = []
mylist = ['jellyfish','jellyish','jellyish','smellyfish']
#convert to unicode
mylist = [unicode(i) for i in mylist]
for i, j in enumerate(mylist):
current = mylist[i]
previous = mylist[i-1]
current_score = jf.jaro_winkler(current, previous)
if(current_score > 0.96):
current=previous
print current, current_score
注意:在没有任何IDE的情况下编写。可能包含一些语法错误。
答案 1 :(得分:0)
您可以直接更新回调内的视图,以获取firebase数据库读取,因为您的firebase代码也在同一个类中。
n*(2^d)
Waqas Pervez的答案也是一个非常好的解决方案。