【问题标题】:EventListeners not entered未输入事件监听器
【发布时间】:2017-03-17 00:15:25
【问题描述】:

我对 Firebase 事件监听器有疑问。我正在尝试从 Firebase 数据库中获取一些数据,但无法取回结果。问题是我的听众没有运行或返回结果。我尝试使用 2 个不同的侦听器(onGetDataListener、ValueEventListener)获得结果。在调试期间,整个侦听器被跳过,调试器向前移动。我在所有侦听器阶段都添加了 Log.d,但没有一个可以访问。

public class Suggestionsfragment extends Fragment implements AdapterView.OnItemClickListener {
    private GooglePlaceList nearby;
    LinearLayout linearLayout;
    Double latitude;
    Double longitude;
    List<String> urlList;
    private List<String> interestList;
    private List<Double> latlong;


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.suggestions, container, false);
        linearLayout = (LinearLayout) v.findViewById(R.id.main_layout);

        String placesKey = this.getResources().getString(R.string.places_key);
        interestList = new ArrayList<>();
        latlong = new ArrayList<>();
        nearby = null;
        FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
        FirebaseUser user = firebaseAuth.getCurrentUser();
        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
        if (user != null) {

            DatabaseReference ref1 = databaseReference.child(user.getUid()).child("interest");
            readData(ref1, new OnGetDataListener() {
                @Override
                public void onSuccess(DataSnapshot dataSnapshot) {
                    Log.d("ONSUCCESS", "Success");
                    for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                        String interests = postSnapshot.getValue(String.class);
                        interestList.add(interests);
                    }
                }
                @Override
                public void onStart() {
                    //whatever you need to do onStart
                    Log.d("ONSTART", "Started");
                }

                @Override
                public void onFailure() {
                Log.d("ONFAILURE", "Failure");
                }
            });
            databaseReference.child(user.getUid());
            databaseReference.child("location");
            databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    Log.d("ONDATACHANGED", "listener2 entered");
                    try {
                        if (dataSnapshot.getValue() != null) {
                            for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                                Double loc = postSnapshot.getValue(Double.class);
                                latlong.add(loc);
                            }

                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }
        latitude = latlong.get(0);
        longitude = latlong.get(1);

        int radius = 500;
        urlList = generateUrlList(interestList, longitude, latitude, radius, placesKey);
        if (placesKey.equals("PUT YOUR KEY HERE"))
            Toast.makeText(getActivity(), "You haven't entered your Google Places Key into the strings file.  Dont forget to set a referer too.", Toast.LENGTH_LONG).show();
        else {
            PlacesReadFeed process = new PlacesReadFeed();
            process.execute(urlList);

        }

        return v;
    }
    ...
}

【问题讨论】:

    标签: android android-fragments firebase firebase-realtime-database


    【解决方案1】:

    有很多问题需要解决。

    此代码不正确:

    databaseReference.child(user.getUid()); // does nothing
    databaseReference.child("location"); // does nothing
    databaseReference.addListenerForSingleValueEvent(...);
    

    你可能想要:

    databaseReference.child(user.getUid()).child("location")
        .addListenerForSingleValueEvent(...);
    

    你说在调试过程中整个监听器被跳过并且调试器向前移动。这是因为在将查询发送到 Firebase 服务器并收到响应之后,侦听器回调会异步触发(更多详细信息 here)。这意味着当这些语句执行时:

    latitude = latlong.get(0);
    longitude = latlong.get(1);
    

    latlong 将不包含有效数据,因为onDataChange() 尚未执行。

    如果您的侦听器从不触发,则可能是您没有互联网连接,或者安全规则未设置为允许读取数据。安全规则解释here。您应该将调试输出添加到onCancelled():

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.e("CANCELLED", databaseError.toException());
    }
    

    我不认识OnGetDataListener()。那是你定义的类吗?

    【讨论】:

    • 我曾经有你指出的数据引用但没有结果:databaseReference.child(user.getUid()).child("location") .addListenerForSingleValueEvent(...);我从这篇文章中找到了 onGetDataListener:stackoverflow.com/questions/42621911/…,这似乎与我的问题有关,但遗憾的是它没有帮助。
    • 你是对的,异步监听回调可能是问题所在。我已经注释掉了可能导致空指针的变量,并且 onDataChanged 在执行后 3 秒运行。我想我需要想办法在其余代码执行之前检索 Firebase 数据。
    【解决方案2】:

    通过在 onDataChanged 中设置我的应用程序,我设法使用异步 firebase 获取:

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.suggestions, container, false);
        linearLayout = (LinearLayout) v.findViewById(R.id.main_layout);
    
        final String placesKey = this.getResources().getString(R.string.places_key);
        interestList = new ArrayList<>();
        latlong = new ArrayList<>();
        nearby = null;
        FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
        FirebaseUser user = firebaseAuth.getCurrentUser();
    
        if (user != null) {
            DatabaseReference ref1 = FirebaseDatabase.getInstance().getReference().child(user.getUid());
            readData(ref1, new OnGetDataListener() {
                @Override
                public void onSuccess(DataSnapshot dataSnapshot) {
                    Log.d("ONSUCCESS", "Success");
                    for (DataSnapshot postSnapshot : dataSnapshot.child("interest").getChildren()) {
                        String interests = postSnapshot.getValue(String.class);
                        interestList.add(interests);
                    }
                    for (DataSnapshot postSnapshot : dataSnapshot.child("location").getChildren()) {
                        Double loc = postSnapshot.getValue(Double.class);
                        latlong.add(loc);
                    }
    
                    latitude = latlong.get(0);
                    longitude = latlong.get(1);
    
                    int radius = 500;
                    urlList = generateUrlList(interestList, longitude, latitude, radius, placesKey);
                    PlacesReadFeed process = new PlacesReadFeed();
                    process.execute(urlList);
                }
    
                @Override
                public void onStart() {
                    //Whatever you want to do on start
                    Log.d("ONSTART", "Started");
                }
    
                @Override
                public void onFailure() {
                    //Whatever you want to do in case of failure
                    Log.d("ONFAILURE", "Failure");
                }
            });
        }
    
        return v;
    }
    

    readData 和 OnGetListener 接口:

    public void readData(DatabaseReference ref, final OnGetDataListener listener) {
        listener.onStart();
        ref.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                listener.onSuccess(dataSnapshot);
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
                listener.onFailure();
            }
        });
    
    }
    
    interface OnGetDataListener {
        //make new interface for call back
        void onSuccess(DataSnapshot dataSnapshot);
        void onStart();
        void onFailure();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2014-02-21
      相关资源
      最近更新 更多