【问题标题】:Nesting of firebase Onclick Listener not workingfirebase Onclick Listener的嵌套不起作用
【发布时间】:2019-06-19 03:49:33
【问题描述】:

我正在构建一个应用程序,其中一部分是将设备 id 提交到 firebase,如果提交了该设备 id,它将上传一个虚拟类设备状态,稍后将由 NodeMCU 更改和使用。 但问题是,当我创建一个数据库引用并将设备 ID 放在 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));
                                    }
                                }


                            });

                        }
                    }
                }
        );
    }

【问题讨论】:

  • databaseReference的数据类型是什么?
  • @Astha 它的类型为 DatabaseReference,我已经更新了问题中的详细信息。
  • 尝试使用FirebaseDatabase.getInstance().getReference("DeviceStatus").child(code).setValue(deviceStatus).addOnCompleteListener( mContext, new OnCompleteListener&lt;Void&gt;() 更新FirebaseDatabase.getInstance().getReference("DeviceStatus").child(code).setValue(deviceStatus).addOnCompleteListener( this, new OnCompleteListener&lt;Void&gt;()(使用您的活动的上下文或引用)
  • 这里的 mContext 是什么??
  • 就我而言,我在内部addOnCompleteListener 中使用了我的BaseActivity 的引用

标签: android firebase firebase-realtime-database


【解决方案1】:

在第二次设置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 的引用存在一些混淆,我编写了一些与您的类似的示例代码(某些变量被替换为“”只是为了示例)。请检查并随时提出任何进一步的问题。

【讨论】:

  • 什么是 getApplicationContext().ge??
  • 糟糕!我在尝试别的东西.. 已更新代码