Firebase的Onclick侦听器嵌套无法正常工作 [英] Nesting of firebase Onclick Listener not working
问题描述
我正在构建一个应用程序,其中一部分是向Firebase提交设备ID,如果提交了该设备ID,它将上传一个虚拟类设备状态,该状态稍后将由NodeMCU更改和使用.但是问题是,当我创建一个数据库引用并将设备ID放置在firebase上时,如果尝试将另一个addOnCompleteListener放置在其中以推送虚拟设备状态类,则会出现一些错误.
I am building an app and a part of it is to submit a device id to firebase and if that device id is submitted it will upload a dummy class device status which is later to be changed and used by NodeMCU. But the problem is that when I create one database reference and put the device id on firebase and within it if I try to put another addOnCompleteListener for pushing dummy device status class, I get some errors.
我提交代码的功能和提交代码时的虚拟设备状态对象.
My function to submit code and a dummy device status object when the code is submitted.
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是一个全局变量,如下:
Here databaseReference is a global variable as:
DatabaseReference databaseReference;
并初始化为
databaseReference = FirebaseDatabase.getInstance().getReference("DeviceStatus").child(devideID);
Android Studio编辑器警告说:
Android Studio Editor warning says:
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));
}
}
});
}
}
}
);
}
推荐答案
在第二次设置 addOnCompleteListener
时使用活动上下文.
Use activity context while setting addOnCompleteListener
second time.
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
的引用存在一些混淆,因此我编写了一些与您的示例代码相似的示例代码(某些变量仅出于示例而用"代替).请检查并随时询问任何进一步的信息.
Since there was some confusion regarding Activity
's reference, I have wriiten some Sample code similar as yours(some variables are replaced with "" just for sample). Please check and feel free to ask any further on this.
这篇关于Firebase的Onclick侦听器嵌套无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!