android - 加载 Firebase 数据时,意图未通过单击传递
问题描述
在我的代码中,当用户单击一个按钮时,它会调用一个函数。在该函数中,数据必须从 firebase 加载。加载成功后,Intent 将使用一些 putExtra 数据传递给另一个活动。
SharedPreferences pref = getApplicationContext().getSharedPreferences("My_pref", MODE_PRIVATE);
choice = pref.getInt("language", 0);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(choice==1)
{
firebase("param1","param2","English");
}
if(choice==2)
{
firebase("param1","param2","hindi");
}
}
});
public void firebase(String files,String titles,String language)
{
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference(language);
DatabaseReference myRef1=myRef.child(titles);
DatabaseReference myRef2=myRef.child(files);
myRef1.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
language_title = dataSnapshot.getValue(String.class);
t=1;
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
myRef2.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
language_file= dataSnapshot.getValue(String.class);
f=1;
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
if(t==1&&f==1) {
Intent i = new Intent(getApplicationContext(), caf.class);
i.putExtra("titles", language_title);
i.putExtra("files", language_file);
startActivity(i);
}
}
但在那种情况下,只有当我点击两次时,意图才会通过。单击时,意图不会通过。哪里有问题?
解决方案
任何需要数据库数据的代码都需要在方法内部onDataChange
或从那里调用。
请参阅我的答案以获得更长的解释:getContactsFromFirebase() 方法返回一个空列表。
由于您有两种onDataChange
方法,因此您需要确保在开始新活动之前都已调用这两种方法。使用一些简单的标志变量来跟踪状态,您可以这样做:
声明两个成员字段:
boolean isTloaded, isFLoaded;
进而
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference(language);
DatabaseReference myRef1=myRef.child(titles);
DatabaseReference myRef2=myRef.child(files);
isTloaded = false;
isFloaded = false;
myRef1.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
language_title = dataSnapshot.getValue(String.class);
t=1;
isTloaded = true;
if (isTloaded && isFloaded) {
startCafActivity();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException(); // never ignore errors
}
});
myRef2.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
language_file= dataSnapshot.getValue(String.class);
f=1;
isFloaded = true;
if (isTloaded && isFloaded) {
startCafActivity();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException(); // never ignore errors
}
});
最后:
private void startCafActivity() {
if(t==1&&f==1) {
Intent i = new Intent(getApplicationContext(), caf.class);
i.putExtra("titles", language_title);
i.putExtra("files", language_file);
startActivity(i);
}
}
它可能更简单,但由于变量名称,我很难弄清楚您的应用程序逻辑。考虑使用更具描述性的命名 than t
,f
并caf
让其他人(以及你未来的自己)更容易理解代码的每个部分单独执行的操作。
推荐阅读
- reactjs - Ref.Current 未定义
- hive - 带节点标签的 hive llap
- mongodb - MongoDB $in 和“like” - 获取具有邮政编码的记录 LIKE 数组中的内容
- c - 指针和/或函数无法正常工作
- angular - 如何使用 ui-router 在 Angular cli 项目中设置guessjs?
- php - 使用在 windows 2000 中运行的 PHP 使用 mozilla 版本 10 生成带有新行的文本文件
- python-3.x - 将十进制数转换为 n 数
- sql - ORA-00920: 带有嵌入 select 语句的无效关系运算符
- c++ - 在 DirectShow 开始播放音频时单击噪音
- javascript - PHP用户端服务器端输入验证错误