Firebase侦听器代码未被触发 [英] Firebase Listener code not being triggered

查看:164
本文介绍了Firebase侦听器代码未被触发的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  public class RideList {
private的ArrayList<平顺> listofRides;
公开的Firebase myFirebase =新的Firebase(https://luminous-torch-1510.firebaseio.com/rides);
上下文上下文;
public RideList(Context context){
this.context = context;
this.listofRides = new ArrayList< Ride>();
}

public ArrayList< Ride> getRides(){
Firebase.setAndroidContext(context);
//附加一个监听器来读取我们游乐设施中的数据参考
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()){
字符串rideString = postSnapshot.getValue()。toString();
String [] rideA = rideString.split();
字符串值;
(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); $ b $ rideA [rideA.length - 1] = rideA [rideA.length - 1] .substring(0,rideA [rideA.length - 1] .indexOf(}));


double numOfPassengers = Double.valueOf(rideA [6]);
双重票价= Double.valueOf(rideA [4]);
double distance = Double.valueOf(rideA [3]);
String origin = rideA [7];
String destination = rideA [2];
double maxPassengers = Double.valueOf(rideA [5]);
字符串departTime = rideA [1];
String arrivalTime = rideA [0];
String timePosted = rideA [8];
String title = rideA [9];
String type1 = rideA [10];
布尔类型;
if(type1.equals(offer))
type = false;
else
type = true;


乘车=新乘车(numOfPassengers,票价,距离,出发地,目的地,maxPassengers,departureTime,arrivalTime,
timePosted,标题,类型);
listofRides.add(ride);


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


$ b $ / code
$ b

这段代码是从一个Activity类的OnCreate函数。任何想法为什么听众代码从来没有被输入/执行?

编辑:下面是这个函数在activity类中被调用的代码。

  list =(ListView)findViewById(R.id.showrides_listView); 
Firebase.setAndroidContext(this);
RideList rl = new RideList(this);
ArrayList arrayList = rl.getRides();
//适配器:需要三个参数:布局的上下文ID(它将显示数据的位置)
//包含数据的数组$ b $ ArrayAdapter适配器= 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);
返回视图;
}
};

//在这里,您将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();
}
});


解决方案

您的数据正在异步加载同步)来自Firebase。把 Thread.sleep()放在那里是不会改变这个事实的。



如果您添加一些日志语句会发生:

  public ArrayList< Ride> getRides(){
Query queryRef = myFirebase.orderByChild(timePosted);
尝试{
System.out.println(Adding listener);
queryRef.addValueEventListener(new ValueEventListener(){
public void onDataChange(DataSnapshot snapshot){
//此代码被异步调用
System.out.println( Firebase);
}
public void onCancelled(FirebaseError firebaseError){
}
});
System.out.println(开始睡眠);
Thread.sleep(2000);
} catch(InterruptedException e){
return null;
}
System.out.println(返回游乐设施);
return listofRides;





输出可能是:


添加监听程序



开始睡眠

返回游乐设施



从Firebase获取数据


您试图使异步进程同步,这是头痛和糟糕的用户体验的秘诀。而不是在这里写一个解决方案,我会链接到一个答案,我写了15分钟前相同的问题:检索ArrayList< Object>来自FireBase内部类


I have a RideList class that is called from an Activity class that retrieves data from a Firebase database. However, when I debug my program the code within my addValueEventListener is never being reached.

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;
    }

    }

This code is being called from an OnCreate function of an Activity class. Any idea on why the listener code is never being entered/executed?

Edit: Here is the code on how this function is being called in the activity class.

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();
    }
});

解决方案

Your data is being loaded asynchronously (and after that continuously synchronized) from Firebase. Putting a Thread.sleep() in there is not going to change that fact.

You can easily see what happens if you add a few log statements:

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;
}

The output is likely:

Adding listener

Starting sleep

Returning rides

Got data from Firebase

You're trying to make an asynchronous process synchronous, which is a recipe for headaches and a bad user experience. Instead of writing up a solution here, I'll link to an answer I wrote 15 minutes ago to the same problem: Retrieving ArrayList<Object> from FireBase inner class

这篇关于Firebase侦听器代码未被触发的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆