Возврат нескольких arraylist .size() вместо одного размера

#java #android #firebase #arraylist #geofire

#java #Android #firebase #arraylist #geofire

Вопрос:

При использовании addGeoQueryDataEventListener я сохраняю всех пользователей в arraylist (должно быть 3), за исключением случаев, когда я иду получать arraylist size (), который выводит 1,2,3 вместо всего 3.

     private int radius = 40;
    private Boolean userFound = false;
    private String userLocationID;
    private ArrayList<String> mUserIDLocation;
    final UserLocation userLocation = new UserLocation();
    public void getUserLocation() {
        final DatabaseReference mRef = FirebaseDatabase.getInstance().getReference();
        final GeoFire geoFire = new GeoFire(mRef.child("user_location"));
        mUserIDLocation = new ArrayList<String>();

        if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED amp;amp; ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling

            return;
        }
        fusedLocationClient.getLastLocation().addOnSuccessListener((Activity) MainActivity.this, new OnSuccessListener<Location>() {

            @Override
            public void onSuccess(Location location) {

                if (location != null) {
                    //Toast.makeText(this, "UserLocation "   location.toString(), Toast.LENGTH_SHORT ).show();
                    //final Location userLocation = location;
                    Log.d(TAG, "onSuccess: UserLocation"   location);
                    Log.d(TAG, "onSuccess: UserLocation Latitude "   location.getLatitude());

                    String user_id = FirebaseAuth.getInstance().getCurrentUser().getUid();




                    geoFire.setLocation(user_id, new GeoLocation(location.getLatitude(), location.getLongitude()), new GeoFire.CompletionListener() {
                        @Override
                        public void onComplete(String key, DatabaseError error) {

                        }
                    });


                }
            }
        });




        GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(48.435, -122.084), radius);


        geoQuery.addGeoQueryDataEventListener(new GeoQueryDataEventListener() {
            @Override
            public void onDataEntered(DataSnapshot dataSnapshot, GeoLocation location) {

                Log.d(TAG, "onDataEntered: datasnapshot "   dataSnapshot);

                mFollowing.add(dataSnapshot.getKey());

                Log.d(TAG, "onDataEntered: mFollowing "   mFollowing);
                Log.d(TAG, "onDataEntered: mFollowing Size "   mFollowing.size());

                getPost();

            }

            @Override
            public void onDataExited(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onDataMoved(DataSnapshot dataSnapshot, GeoLocation location) {

            }

            @Override
            public void onDataChanged(DataSnapshot dataSnapshot, GeoLocation location) {

            }

            @Override
            public void onGeoQueryReady() {

            }

            @Override
            public void onGeoQueryError(DatabaseError error) {

            }
        });

    }
  

журнал одного пользователя datasnapshot:

 DataSnapshot { key = xjfXxJ3spuPNywtHyqg5rNnlIMD3, value = {.priority=c295tcm4kd, l={0=48.435, 1=-122.084}, g=c295tcm4kd} }
  

журнал mFollowing массива:

 2019-04-03 18:13:30.821 28961-28961/? D/MainActivity: onDataEntered: mFollowing [xjfXxJ3spuPNywtHyqg5rNnlIMD3]

2019-04-03 18:13:31.651 28961-28961/com.beepic D/MainActivity: onDataEntered: mFollowing [xjfXxJ3spuPNywtHyqg5rNnlIMD3, TMOb5NL8igZovGkiZdVcl3UQmxV2]

2019-04-03 18:13:31.653 28961-28961/com.beepic D/MainActivity: onDataEntered: mFollowing [xjfXxJ3spuPNywtHyqg5rNnlIMD3, TMOb5NL8igZovGkiZdVcl3UQmxV2, IWJbi7sQe2MdbWET9d1vEqum9tb2]
  

журнал mFollowing.size()

 2019-04-03 18:13:30.821 28961-28961/? D/MainActivity: onDataEntered: mFollowing Size 1
2019-04-03 18:13:31.651 28961-28961/com.beepic D/MainActivity: onDataEntered: mFollowing Size 2
2019-04-03 18:13:31.653 28961-28961/com.beepic D/MainActivity: onDataEntered: mFollowing Size 3
  

Ниже я использую mFollowing.size() для получения всех сообщений от пользователей, хранящихся в mFollowing.

     private void getPost(){
        Log.d(TAG, "getPost: getting post");

        DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
        Log.d(TAG, "getPost: mfollowing size3 "   mFollowing.size());
        for( int i = 0; i < mFollowing.size(); i  ){


            Log.d(TAG, "getPost: mFollowing "   mFollowing);
            Log.d(TAG, "getPost: getting size "   mFollowing.size());
            final int count = i;
            Query query = reference
                    .child(getString(R.string.dbname_user_interest_post))
                    .child(mFollowing.get(i))

                    .orderByChild(getString(R.string.field_user_id))
                    .equalTo(mFollowing.get(i));

            Log.d(TAG, "getPost: getPost query: "   query);
            query.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
                        Log.d(TAG, "onDataChange: main feed getChildren "   dataSnapshot.getChildren());
                        Log.d(TAG, "onDataChange: onDataChange main feed: "   singleSnapshot
                                .child(getString(R.string.field_user_id)));

                        NewPost post = new NewPost();
                        Map<String, Object> objectMap = (HashMap<String, Object>) singleSnapshot.getValue();

                        post.setCaption(objectMap.get(getString(R.string.field_caption)).toString());
                        post.setPhoto_id(objectMap.get(getString(R.string.field_photo_id)).toString());
                        post.setUser_id(objectMap.get(getString(R.string.field_user_id)).toString());
                        post.setInterest(objectMap.get(getString(R.string.string_interest)).toString());
                        post.setDate_created(objectMap.get(getString(R.string.field_date_created)).toString());


                        post.setImage_path(objectMap.get(getString(R.string.field_image_path)).toString());

                        Log.d(TAG, "onDataChange: getPost caption main "   post);

                        mNewPost.add(post);
                    }

                    if(count >= mFollowing.size() -1){

                        //display post
                        displayPost();
                    }

                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });
        }

    }
  

Вот журнал, следующий при использовании в getPost();

 2019-04-03 18:19:32.476 29167-29167/? D/MainActivity: getPost: mFollowing [xjfXxJ3spuPNywtHyqg5rNnlIMD3]
2019-04-03 18:19:33.019 29167-29167/com.beepic D/MainActivity: getPost: mFollowing [xjfXxJ3spuPNywtHyqg5rNnlIMD3, TMOb5NL8igZovGkiZdVcl3UQmxV2]
2019-04-03 18:19:33.020 29167-29167/com.beepic D/MainActivity: getPost: mFollowing [xjfXxJ3spuPNywtHyqg5rNnlIMD3, TMOb5NL8igZovGkiZdVcl3UQmxV2]
2019-04-03 18:19:33.020 29167-29167/com.beepic D/MainActivity: getPost: mFollowing [xjfXxJ3spuPNywtHyqg5rNnlIMD3, TMOb5NL8igZovGkiZdVcl3UQmxV2, IWJbi7sQe2MdbWET9d1vEqum9tb2]
2019-04-03 18:19:33.021 29167-29167/com.beepic D/MainActivity: getPost: mFollowing [xjfXxJ3spuPNywtHyqg5rNnlIMD3, TMOb5NL8igZovGkiZdVcl3UQmxV2, IWJbi7sQe2MdbWET9d1vEqum9tb2]
2019-04-03 18:19:33.021 29167-29167/com.beepic D/MainActivity: getPost: mFollowing [xjfXxJ3spuPNywtHyqg5rNnlIMD3, TMOb5NL8igZovGkiZdVcl3UQmxV2, IWJbi7sQe2MdbWET9d1vEqum9tb2]
  

Как вы можете видеть, это приводит к тому, что количество моих сообщений не соответствует норме. Раньше я использовал приведенный ниже код перед внедрением GeoFire, и он работал нормально, но он получил каждого пользователя в базе данных. Следующий размер будет равен 7 (текущее количество пользователей в базе данных).

     private void getUsersPost() {
        Log.d(TAG, "getUsersPost: getting all the post");

        swipe.setRefreshing(false);

        Log.d(TAG, "onKeyEntered: setUserLocation insidegetUserPost "    userLocation.getUserLocations());

        DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
        Query query = reference
                .child("user_location");
        //getString(R.string.dbname_user_interest_post)

        Log.d(TAG, "getUsersPost: getUserPost query main: "   query);
        query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
                    Log.d(TAG, "onDataChange: found user main getUsersPost: "   singleSnapshot.getKey());

                    mFollowing.add(singleSnapshot.getKey());

                    Log.d(TAG, "onDataEntered: mFollowing1 "   mFollowing);
                    Log.d(TAG, "onDataEntered: mFollowing size1 "   mFollowing.size());
                }
                Log.d(TAG, "onDataEntered: mFollowing2 "   mFollowing);
                Log.d(TAG, "onDataEntered: mFollowing size2 "   mFollowing.size());

                //get the post
                getPost();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });


    }
  

Если у кого-либо есть какие-либо вопросы, пожалуйста, задавайте. Я хотел бы решить эту проблему.

Комментарии:

1. Вы не должны переносить создание одного прослушивателя (GeoFire) в другое событие прослушивателя (onsucclistener для Location), вы просто регистрируете несколько прослушивателей для GeoFire.

2. Я изменил это, но проблема все та же. Спасибо за лучшую практику, хотя.

3. Поскольку ответа пока нет, пожалуйста, обновите свой код в вопросе, чтобы отразить последние изменения. Это позволит избежать написания другими комментария / ответа относительно обернутых слушателей.