Java 使用嵌套addValueEventListener时出现Android firebase错误
我正在使用FireBase的Android应用程序。在我添加的数据库中,我向其中一个用户发布添加了两个表。我输入了发布信息和URI的数量,以便通过另一个表检索每个用户的信息。当我这样做时,我需要使用数据库事件Java 使用嵌套addValueEventListener时出现Android firebase错误,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在使用FireBase的Android应用程序。在我添加的数据库中,我向其中一个用户发布添加了两个表。我输入了发布信息和URI的数量,以便通过另一个表检索每个用户的信息。当我这样做时,我需要使用数据库事件 (.addValueEventListener). 是嵌套的,但我得到一个错误 错误:157,33错误:从内部类访问局部变量UserName;需要宣布为最终决定 这是使用的代码 我使用的这部分数据库 将UserName声明为类的属性,并且您将正确地获得UserName的null值,因为您
(.addValueEventListener).
是嵌套的,但我得到一个错误
错误:157,33错误:从内部类访问局部变量UserName;需要宣布为最终决定
这是使用的代码
我使用的这部分数据库
将UserName声明为类的属性,并且您将正确地获得UserName的null值,因为您在加载用户之前设置了HistoryObject的实例
检查我的修复
private String UserName = "";
private void UserPostInformation(final String key)
{
DatabaseReference historyDatabase = FirebaseDatabase.getInstance().getReference().child("ThePostting").child(key);
historyDatabase.addValueEventListener(new ValueEventListener()
{
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists())
{
String IdHistory = dataSnapshot.getKey();
Long time = 0L;
String foodname11 = "";
String imagefood1 = "";
String s = null;
String name = "name";
UserName = "";
for (DataSnapshot child : dataSnapshot.getChildren())
{
if (child.getKey().equals("time")) {
time = Long.valueOf(child.getValue().toString());
}
if (child.getKey().equals("FoodName")) {
foodname11 = child.getValue().toString();
}
if (child.getKey().equals("profileImageUrl")) {
imagefood1 = child.getValue().toString();
}
if (child.getKey().equals("UserID")) {
s = child.getValue().toString();
}
}
UserIDGetInfo = s;
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("Users").child(UserIDGetInfo);
databaseReference.addListenerForSingleValueEvent(new ValueEventListener()
{
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists())
{
Map<String,Object> map = (Map<String,Object>) dataSnapshot.getValue();
if (map.get("name")!=null)
{
UserName= map.get("name").toString();
}
HistoryObject obj = new HistoryObject(IdHistory , getDate(time),foodname11 , imagefood1 , UserName);
resultHistory.add(obj);
mhistoryAdapter.notifyDataSetChanged();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
要么将username声明为类变量,要么将修饰符更改为final,错误很明显,表示本地变量username是从内部类访问的;需要宣布为最终决定
因此,将其声明为最终Stirng用户名我认为您可能误解了多线程的工作原理。您很可能正在创建userName=null的HistoryObject。我这样做了,但没有得到需要的信息,也没有得到用户名
private String UserName = "";
private void UserPostInformation(final String key)
{
DatabaseReference historyDatabase = FirebaseDatabase.getInstance().getReference().child("ThePostting").child(key);
historyDatabase.addValueEventListener(new ValueEventListener()
{
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists())
{
String IdHistory = dataSnapshot.getKey();
Long time = 0L;
String foodname11 = "";
String imagefood1 = "";
String s = null;
String name = "name";
UserName = "";
for (DataSnapshot child : dataSnapshot.getChildren())
{
if (child.getKey().equals("time")) {
time = Long.valueOf(child.getValue().toString());
}
if (child.getKey().equals("FoodName")) {
foodname11 = child.getValue().toString();
}
if (child.getKey().equals("profileImageUrl")) {
imagefood1 = child.getValue().toString();
}
if (child.getKey().equals("UserID")) {
s = child.getValue().toString();
}
}
UserIDGetInfo = s;
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("Users").child(UserIDGetInfo);
databaseReference.addListenerForSingleValueEvent(new ValueEventListener()
{
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists())
{
Map<String,Object> map = (Map<String,Object>) dataSnapshot.getValue();
if (map.get("name")!=null)
{
UserName= map.get("name").toString();
}
HistoryObject obj = new HistoryObject(IdHistory , getDate(time),foodname11 , imagefood1 , UserName);
resultHistory.add(obj);
mhistoryAdapter.notifyDataSetChanged();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}