Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用嵌套addValueEventListener时出现Android firebase错误_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java 使用嵌套addValueEventListener时出现Android firebase错误

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值,因为您

我正在使用FireBase的Android应用程序。在我添加的数据库中,我向其中一个用户发布添加了两个表。我输入了发布信息和URI的数量,以便通过另一个表检索每个用户的信息。当我这样做时,我需要使用数据库事件

(.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) {

        }
    });

}