android中的第二级回调不适用于嵌套查询

用户名

我创建了一个geofire火力地堡位置类。我能够从位置表中读取订户密钥。但是,现在我想查询订户表以获取完整的订户对象。

在onGeoQueryReady方法内部,我拥有所有订户密钥。但是,当我在onGeoQueryReady方法内对订户表进行get调用时,它不返回任何内容。

 public void findNearBySubscribers(final LocationInterface locationInterface, double radius, double clatitude, double clongitude){
        DatabaseReference ref = FirebaseDatabase.getInstance().getReference("location/");
        GeoFire geoFire = new GeoFire(ref);
        final ArrayList<String> keys = new ArrayList<String>();
        GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(clatitude, clongitude), radius);
        geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
            @Override
            public void onKeyEntered(String key, GeoLocation location) {
                keys.add(key);
            }

            @Override
            public void onKeyExited(String key) {
                System.out.println(String.format("Key %s is no longer in the search area", key));
            }

            @Override
            public void onKeyMoved(String key, GeoLocation location) {

            }

            @Override
            public void onGeoQueryReady() {

                locationInterface.getNearBySubscribersCallback(keys);
            }

            @Override
            public void onGeoQueryError(DatabaseError error) {
                System.err.println("There was an error with this query: " + error);
            }
        });
    }

下面的基于密钥查找订户的代码不起作用。订户列表大小为零,但响应字符串具有值。有人可以帮我吗 看起来这是一个2级回调...

 public void findNearBySubscribers(final LocationInterface locationInterface, double radius, double clatitude, double clongitude){
        DatabaseReference ref = FirebaseDatabase.getInstance().getReference("location/");
        GeoFire geoFire = new GeoFire(ref);
        final ArrayList<String> keys = new ArrayList<String>();
        GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(clatitude, clongitude), radius);
        geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
            @Override
            public void onKeyEntered(String key, GeoLocation location) {
                keys.add(key);
            }

            @Override
            public void onKeyExited(String key) {
                System.out.println(String.format("Key %s is no longer in the search area", key));
            }

            @Override
            public void onKeyMoved(String key, GeoLocation location) {

            }

            @Override
            public void onGeoQueryReady() {
                final ArrayList<Subscriber> subscriberList = new ArrayList<Subscriber>();

                for(String key: keys) {
                    String url = "https://moe-90cc7.firebaseio.com/subscriber/";
                    String uri = url + key + ".json";
                    RestClient.get(uri, null, new TextHttpResponseHandler() {
                        @Override
                        public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
                        }

                        @Override
                        public void onSuccess(int statusCode, Header[] headers, String responseString) {
                            Gson gson = new Gson();
                            Subscriber subscriber = gson.fromJson(responseString, Subscriber.class);
                            System.out.println("Response Str" + responseString);
                             subscriberList.add(subscriber);
                        }
                    });
                }
                System.out.println("List size "+subscriberList.size());
                locationInterface.getNearBySubscribersCallback(keys);
            }

            @Override
            public void onGeoQueryError(DatabaseError error) {
                System.err.println("There was an error with this query: " + error);
            }
        });
    }

尝试了红色药丸的方法-但对我不起作用。基本上,我试图在有订户密钥可用时加载订户。

package app.com.date.services;

import com.firebase.geofire.GeoFire;
import com.firebase.geofire.GeoLocation;
import com.firebase.geofire.GeoQuery;
import com.firebase.geofire.GeoQueryEventListener;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.gson.Gson;
import com.loopj.android.http.TextHttpResponseHandler;

import java.util.ArrayList;
import java.util.concurrent.Semaphore;

import app.com.date.subscriber.Subscriber;
import cz.msebera.android.httpclient.Header;

public class LocationService {
    private ArrayList<Subscriber> subscriberList = new ArrayList<Subscriber>();

    public void addGeoLocation(final LocationInterface locationInterface, String subscriberId, double latitude, double longitude) {

        DatabaseReference ref = FirebaseDatabase.getInstance().getReference("location/");
        GeoFire geoFire = new GeoFire(ref);
        geoFire.setLocation(subscriberId, new GeoLocation(latitude, longitude), new GeoFire.CompletionListener() {
            @Override
            public void onComplete(String key, DatabaseError error) {
                if (key != null) {
                    locationInterface.addLocationCallback(true);
                } else {
                    locationInterface.addLocationCallback(false);
                }
            }
        });
    }

    public void findNearBySubscribers(final LocationInterface locationInterface, double radius, double clatitude, double clongitude) {
        DatabaseReference ref = FirebaseDatabase.getInstance().getReference("location/");
        GeoFire geoFire = new GeoFire(ref);
        final ArrayList<String> keys = new ArrayList<String>();
        final ArrayList<Subscriber> subscriberList = new ArrayList<Subscriber>();
        GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(clatitude, clongitude), radius);
        geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
            @Override
            public void onKeyEntered(String key, GeoLocation location) {
                String url = "https://moe-90cc7.firebaseio.com/subscriber/";
                String uri = url + key + ".json";
                RestClient.get(uri, null, new TextHttpResponseHandler() {
                    @Override
                    public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
                    }
                    @Override
                    public void onSuccess(int statusCode, Header[] headers, String responseString) {
                        Gson gson = new Gson();
                        Subscriber subscriber = gson.fromJson(responseString, Subscriber.class);
                        System.out.println("Response Str" + responseString);
                        subscriberList.add(subscriber);
                    }
                });

                System.out.println("onKeyEntered list "+subscriberList.size());

            }

            @Override
            public void onKeyExited(String key) {
                System.out.println(String.format("Key %s is no longer in the search area", key));
            }

            @Override
            public void onKeyMoved(String key, GeoLocation location) {

            }

            @Override
            public void onGeoQueryReady() {
                System.out.println("onGeoQueryReady list "+subscriberList.size());
            }

            @Override
            public void onGeoQueryError(DatabaseError error) {
                System.err.println("There was an error with this query: " + error);
            }
        });
    }
}

输出

12-31 17:57:34.090 13956-14019/app.com.date V/FA: Processing queued up service tasks: 3
12-31 17:57:34.366 13956-13956/app.com.date I/System.out: onKeyEntered list 0
12-31 17:57:34.366 13956-13956/app.com.date I/System.out: onKeyEntered list 0
12-31 17:57:34.366 13956-13956/app.com.date I/System.out: onGeoQueryReady list 0
12-31 17:57:34.456 13956-13956/app.com.date V/AsyncHttpRH: Progress 332 from 332 (100%)
12-31 17:57:34.475 13956-13956/app.com.date I/System.out: Response Str{"age":29,"alcohol":false,"animalLover":false,"children":false,"id":"GYlSDXx0Kwh7AerOzFGf8MDmhOg1","isEmpty":false,"mainImage":"https://firebasestorage.googleapis.com/v0/b/moe-erOzFGf8MDmhOg1%2F1265290048?alt=media&token=80ab1410-bac9-4679-a3d4-152204319310","name":"singh","smoker":false}
12-31 17:57:34.574 13956-13956/app.com.date V/AsyncHttpRH: Progress 327 from 327 (100%)
12-31 17:57:34.584 13956-13956/app.com.date I/System.out: Response Str{"age":65,"alcohol":false,"animalLover":false,"children":false,"id":"xZWPMjWQCYY4xNimx3WHqVZcQxs1","isEmpty":false,"mainImage":"https://firebasestorage.googleapQCYY4xNimx3WHqVZcQxs1%2F1405868067?alt=media&token=b8d128a6-7156-42e8-9d0b-953feb128b4c","name":" Singh","smoker":false}
12-31 17:57:39.123 13956-14019/app.com.date V/FA: Inactivity, disconnecting from the service
弗兰克·范普菲伦

问题出在以下代码中:

final ArrayList<Subscriber> subscriberList = new ArrayList<Subscriber>();

for(String key: keys) {
    String url = "https://moe-90cc7.firebaseio.com/subscriber/";
    String uri = url + key + ".json";
    RestClient.get(uri, null, new TextHttpResponseHandler() {
        @Override
        public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
        }

        @Override
        public void onSuccess(int statusCode, Header[] headers, String responseString) {
            Gson gson = new Gson();
            Subscriber subscriber = gson.fromJson(responseString, Subscriber.class);
            System.out.println("Response Str" + responseString);
             subscriberList.add(subscriber);
        }
    });
}
System.out.println("List size "+subscriberList.size());
locationInterface.getNearBySubscribersCallback(keys);

数据是从Firebase异步加载的这意味着,在您打印时subscriberList.size(),您尚未加载任何订阅者。

这最容易看出是否更改代码以输出一些简单的日志记录语句:

final ArrayList<Subscriber> subscriberList = new ArrayList<Subscriber>();

System.out.println("Before starting to load");
for(String key: keys) {
    String url = "https://moe-90cc7.firebaseio.com/subscriber/";
    String uri = url + key + ".json";
    RestClient.get(uri, null, new TextHttpResponseHandler() {
        @Override
        public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
        }

        @Override
        public void onSuccess(int statusCode, Header[] headers, String responseString) {
            Gson gson = new Gson();
            Subscriber subscriber = gson.fromJson(responseString, Subscriber.class);
            System.out.println("Response Str" + responseString);
            subscriberList.add(subscriber);
            System.out.println("In onSuccess, list size "+subscriberList.size());
        }
    });
}
System.out.println("After starting to load, list size "+subscriberList.size());
locationInterface.getNearBySubscribersCallback(keys);

其输出将是:

开始加载之前

开始加载后,列表大小为0

在onSuccess中,列表大小为1

在onSuccess中,列表大小2

...

因此,您可以在文件下部的代码之后看到onSuccess()运行中的代码。请记住:这是因为数据是异步加载的,并且在处理现代Web /云API时是完全正常的行为。

解决方案是重新构造您的问题。与其说“先加载用户,然后对他们进行xyz”,不如将问题重新定义为“只要用户已更改,就对他们进行xyz”。

这样做的实现是您移动,做一些东西到用户的代码onSuccess处理程序,就像我和打印用户列表的长度来完成。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章