Как я могу получать данные из Firebase непрерывно в течение всего oop, и данные должны быть проверены внутри него, если данные неверны? L oop следует закрыть - PullRequest
0 голосов
/ 18 марта 2020

l oop предназначен для непрерывного получения данных до тех пор, пока не изменится значение базы данных, но предоставление l oop для непрерывного получения данных из Firebase не работает.

Первое, что мы Мне нужно получить текущее местоположение, и это работает отлично.

        mDatabase = FirebaseDatabase.getInstance().getReference();
        mDatabase.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {


            try {
                //value of latitude is copied to latit
                String latit = dataSnapshot.child("latitude").getValue().toString();
                //value of longitude is copied to longi
                String longi = dataSnapshot.child("longitude").getValue().toString();

                l1 = Double.valueOf(latit);
                l2 = Double.valueOf(longi);

                Toast.makeText(getApplicationContext(), "lati" + l1 + "and longi" + l2, Toast.LENGTH_SHORT).show();
            }
            catch (Exception e) {
                Toast.makeText(getApplicationContext(), "error occured", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Toast.makeText(getApplicationContext(), "Database error", Toast.LENGTH_SHORT).show();
        }
    });

Выполнив этот код, я получил текущие данные из базы данных Firebase в реальном времени

И ниже покажите код, который не работает для me.

                        while(n==1) {
                        mDatabase1 = FirebaseDatabase.getInstance().getReference();

                            mDatabase1.addValueEventListener(new ValueEventListener() {

                                @Override
                                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                    String latit1 = dataSnapshot.child("latitude").getValue().toString();
                                    //value of longitude is copied to longi
                                    String longi1 = dataSnapshot.child("longitude").getValue().toString();

                                    l3 = Double.valueOf(latit1);
                                    l4 = Double.valueOf(longi1);
                                    //the below code is for showing a notification.

здесь l1 и l3 - широта, а l2 и l4 - долгота. l1 и l3 объявлены выше.

                                    if (!(l1.equals(l3) && l2.equals(l4))) {
                                        createChannels();
                                        String title = "Danger";
                                        String content = "Your Vehicle has been moved";
                                        Notification.Builder builder = getEDMTChannelNotification(title, content);
                                        getManager().notify(new Random().nextInt(), builder.build());
                                        n = 0;
                                        //n set to zero and loop exit when notification is shown.
                                    }
                                }

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

                                }

                            });
                        }

1 Ответ

0 голосов
/ 18 марта 2020

Вам не нужно помещать эту проверку внутри по существу бесконечной l oop. ValueEventListener, однажды установленный, автоматически срабатывает каждый раз, когда происходит изменение в ссылке, на которую вы смотрите. Так что вам просто нужно установить слушателя, и он будет всегда срабатывать, пока приложение открыто.

Пример из документации:

ValueEventListener postListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        // Get Post object and use the values to update the UI
        Post post = dataSnapshot.getValue(Post.class);
        // ...
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        // Getting Post failed, log a message
        Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
        // ...
    }
};
mPostReference.addValueEventListener(postListener);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...