Вложение Firebase Onclick Listener не работает - PullRequest
0 голосов
/ 19 июня 2019

Я создаю приложение, и часть его состоит в том, чтобы отправить идентификатор устройства в firebase, и если этот идентификатор устройства будет отправлен, он загрузит фиктивный статус устройства класса, который позже будет изменен и использован NodeMCU. Но проблема в том, что, когда я создаю одну ссылку на базу данных и помещаю идентификатор устройства в базу данных Firebase, а внутри нее, если я пытаюсь поместить еще один addOnCompleteListener для передачи класса состояния фиктивного устройства, я получаю некоторые ошибки.

Моя функция для отправки кода и фиктивного объекта состояния устройства при отправке кода.

    void submitCode(String scannedCode){
        code=scannedCode;
        databaseReference.setValue(code).addOnCompleteListener(
                this, new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if (task.isSuccessful()){
                            DeviceStatus deviceStatus = new DeviceStatus();
                            deviceStatus.deviceID = code;
                            FirebaseDatabase.getInstance().getReference("DeviceStatus").child(code).setValue(deviceStatus).addOnCompleteListener(
                                    this, new OnCompleteListener<Void>() {
                                        @Override
                                        public void onComplete(@NonNull Task<Void> subTask) {
                                            if (subTask.isSuccessful()) {
                                                Toast.makeText(getApplicationContext(), "Product ID Successfully Entered", Toast.LENGTH_LONG).show();
                                                finish();
                                                startActivity(new Intent(getApplicationContext(), switchStatus.class));
                                            }
                                        }
                                    }
                            );

                        }
                    }
                }
        );


    }


Здесь databaseReference является глобальной переменной как:

DatabaseReference databaseReference;

И инициализируется как

databaseReference = FirebaseDatabase.getInstance().getReference("DeviceStatus").child(devideID);

Предупреждение редактора Android Studio гласит:

Cannot resolve method 'addOnCompleteListener(anonymous com.google.android.gms.tasks.OnCompleteListener<java.lang.Void>, anonymous com.google.android.gms.tasks.OnCompleteListener<java.lang.Void>)'

Ошибка сборки говорит

error: no suitable method found for addOnCompleteListener(<anonymous OnCompleteListener<Void>>,<anonymous OnCompleteListener<Void>>)
method Task.addOnCompleteListener(Executor,OnCompleteListener<Void>) is not applicable
(argument mismatch; <anonymous OnCompleteListener<Void>> cannot be converted to Executor)
method Task.addOnCompleteListener(Activity,OnCompleteListener<Void>) is not applicable
(argument mismatch; <anonymous OnCompleteListener<Void>> cannot be converted to Activity)

Обновлена ​​функция:

    void submitCode(String scannedCode){
        code=scannedCode;
        databaseReference.setValue(code).addOnCompleteListener(
                this, new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if (task.isSuccessful()){
//                            sendSwitchStatus(code);
                            DeviceStatus deviceStatus = new DeviceStatus();
                            deviceStatus.deviceID = code;
                            FirebaseDatabase.getInstance().getReference("DeviceStatus").child(code).setValue(deviceStatus).addOnCompleteListener( getBaseContext(), new OnCompleteListener<Void>(){


                                public void onComplete(@Nullable Task<void> subTask){
                                    if (subTask.isSuccessful()) {
                                        Toast.makeText(getApplicationContext(), "Product ID Successfully Registered", Toast.LENGTH_LONG).show();
                                        finish();
                                        startActivity(new Intent(getApplicationContext(), switchStatus.class));
                                    }
                                }


                            });

                        }
                    }
                }
        );
    }

1 Ответ

1 голос
/ 19 июня 2019

Использовать контекст активности при установке addOnCompleteListener во второй раз.

public class MainActivity extends AppCompatActivity {
    private int toggle = 0;
    DatabaseReference databaseReference;
    Activity activity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        activity = this;
        databaseReference = FirebaseDatabase.getInstance().getReference("DeviceStatus").child("");
    }
    void submitCode(String scannedCode){
        String code = scannedCode;
        databaseReference.setValue(code).addOnCompleteListener(this, new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                FirebaseDatabase.getInstance().getReference("DeviceStatus").child("").setValue("").addOnCompleteListener(activity, new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {

                    }
                });
            }
        });
    }
}

Поскольку имелась некоторая путаница в отношении ссылки Activity, я написал некоторый пример кода, похожий на ваш (некоторые переменные заменены на "" только для образца). Пожалуйста, проверьте и не стесняйтесь спрашивать об этом.

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