【问题标题】:Firebase Listener code not being triggeredFirebase 侦听器代码未触发
【发布时间】:2016-03-11 07:42:14
【问题描述】:

我有一个 RideList 类,它从一个从 Firebase 数据库中检索数据的 Activity 类中调用。但是,当我调试我的程序时,我的 addValueEventListener 中的代码永远不会被访问。

public class RideList {
        private ArrayList<Ride> listofRides;
        public Firebase myFirebase = new Firebase("https://luminous-torch-1510.firebaseio.com/rides");
        Context context;
    public RideList(Context context) {
        this.context = context;
        this.listofRides = new ArrayList <Ride>();
    }

    public ArrayList<Ride> getRides() {
        Firebase.setAndroidContext(context);
        // Attach an listener to read the data at our rides reference
        Query queryRef = myFirebase.orderByChild("timePosted");
        try {
            queryRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot snapshot) {
                    System.out.println("There are " + snapshot.getChildrenCount() + " rides");
                    for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                        String rideString = postSnapshot.getValue().toString();
                        String[] rideA = rideString.split(" ");
                        String value;
                        for (int i = 0; i < rideA.length - 1; i++) {
                            rideA[i] = rideA[i].substring(rideA[i].indexOf("=") + 1);
                            rideA[i] = rideA[i].substring(0, rideA[i].indexOf(","));
                        }
                        rideA[rideA.length - 1] = rideA[rideA.length - 1].substring(rideA[rideA.length - 1].indexOf("=") + 1);
                        rideA[rideA.length - 1] = rideA[rideA.length - 1].substring(0, rideA[rideA.length - 1].indexOf("}"));


                        double numOfPassengers = Double.valueOf(rideA[6]);
                        double fare = Double.valueOf(rideA[4]);
                        double distance = Double.valueOf(rideA[3]);
                        String origin = rideA[7];
                        String destination = rideA[2];
                        double maxPassengers = Double.valueOf(rideA[5]);
                        String departTime = rideA[1];
                        String arrivalTime = rideA[0];
                        String timePosted = rideA[8];
                        String title = rideA[9];
                        String type1 = rideA[10];
                        boolean type;
                        if (type1.equals("offer"))
                            type = false;
                        else
                            type = true;


                        Ride ride = new Ride(numOfPassengers, fare, distance, origin, destination, maxPassengers, departTime, arrivalTime,
                                timePosted, title, type);
                        listofRides.add(ride);
                    }
                }

                @Override
                public void onCancelled(FirebaseError firebaseError) {
                    System.out.println("The read failed: " + firebaseError.getMessage());
                }
            });
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            return null;
        }
        return listofRides;
    }

    }

从 Activity 类的 OnCreate 函数调用此代码。关于为什么永远不会输入/执行侦听器代码的任何想法?

编辑:这是关于如何在活动类中调用此函数的代码。

list = (ListView) findViewById(R.id.showrides_listView);
Firebase.setAndroidContext(this);
RideList rl = new RideList(this);
ArrayList arrayList = rl.getRides();
// Adapter: You need three parameters 'the context, id of the layout (it will be where the data is shown),
// and the array that contains the data
ArrayAdapter adapter = new ArrayAdapter<Ride>(getApplicationContext(), android.R.layout.simple_spinner_item, arrayList){
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);
        TextView text = (TextView) view.findViewById(android.R.id.text1);
        text.setTextColor(Color.BLACK);
        return view;
    }
};

// Here, you set the data in your ListView
list.setAdapter(adapter);
adapter.notifyDataSetChanged();

FloatingActionButton myFab = (FloatingActionButton)  findViewById(R.id.showrides_fab);
myFab.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
       startCreateRideActivity();
    }
});

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    您的数据正在从 Firebase 异步加载(然后持续同步)。将Thread.sleep() 放在那里不会改变这一事实。

    如果添加一些日志语句,您可以很容易地看到会发生什么:

    public ArrayList<Ride> getRides() {
        Query queryRef = myFirebase.orderByChild("timePosted");
        try {
            System.out.println("Adding listener");
            queryRef.addValueEventListener(new ValueEventListener() {
                public void onDataChange(DataSnapshot snapshot) {
                    // THIS CODE IS CALLED ASYNCHRONOUSLY
                    System.out.println("Got data from Firebase");
                }
                public void onCancelled(FirebaseError firebaseError) {
                }
            });
            System.out.println("Starting sleep");
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            return null;
        }
        System.out.println("Returning rides");
        return listofRides;
    }
    

    输出很可能:

    添加监听器

    开始睡觉

    回程

    从 Firebase 获取数据

    您正在尝试使异步流程同步,这会导致头痛和糟糕的用户体验。我不会在这里写出解决方案,而是链接到我 15 分钟前针对同一问题写的答案:Retrieving ArrayList<Object> from FireBase inner class

    【讨论】:

    • 在我的活动类中,我计划使用此函数返回的 ArrayList 来填充 ArrayAdapter。查看所有其他解决方案。我不确定如何在此处的 onDataChange 函数中填充我的 ArrayAdapter,因为它需要在活动类中。感谢其他参考,绝对让我更好地了解我做错了什么!
    • 我添加了关于如何在活动类中使用此函数的代码。在这种情况下,我将如何遵循对 onDataChange 函数中的数据进行所需的所有操作的策略的任何提示?
    猜你喜欢
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2022-06-10
    • 2020-08-26
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多