java - 如何将检索到的数据从firebase保存到android中的字符串变量?
问题描述
Hy Developers,我是 android 开发的新手,所以这就是为什么在将数据保存和查看到我的 android 应用程序时遇到问题的原因。
我知道只有在您连接到互联网时才能检索数据。
但问题是它正在检索数据并显示到 android 日志。
但是,当我尝试将其保存到字符串变量或 arraylist 以使用该列表或变量在主要活动中显示它时,它不起作用。
我在 onCreate 方法之前声明了一个私有字符串变量来存储来自 firebase 数据库的值。
对不起我的问题。但这是我面临的问题。
以下是我正在使用的代码和一些屏幕截图,以使问题易于理解。
public class MainActivity extends AppCompatActivity {
private static final String TAG = "Firelog" ;
Button ans1, ans2, ans3, ans4;
TextView uscore, question, timer;
private String mAnswer;
private ArrayList<String> fbquestions = new ArrayList<String>();
private String quest;
private int mScore = 0;
Random r = new Random();
private int res = 0;
private int c = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
uscore = (TextView) findViewById(R.id.uscore);
question = (TextView) findViewById(R.id.question);
timer = (TextView) findViewById(R.id.timer);
ans1 = (Button) findViewById(R.id.ans1);
ans2 = (Button) findViewById(R.id.ans2);
ans3 = (Button) findViewById(R.id.ans3);
ans4 = (Button) findViewById(R.id.ans4);
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("mcqs");
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Map <String, String> map = (Map)dataSnapshot.getValue();
quest = map.get("question");
fbquestions.add(quest);
Log.v("E_Value","Question is" + quest);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
question.setText(String.valueOf(fbquestions.get(0)));
}
}
在上面的图片中,您可以看到该问题已从 firebase 成功检索并在日志中可见。
但是在这里,当我尝试分配后在主屏幕上显示问题时,它显示为空白。
添加代码以向arraylist添加值后,应用程序崩溃..
解决方案
您不能简单地获取方法fbquestions.get(0)
外部的值,onDataChange()
因为此方法具有异步行为。因此,您不能简单地将fbquestions
列表创建为全局变量并在 callbakc 之外使用它的值,因为它始终是empty
. 基本上,您正在尝试从异步 API 同步使用值。这不是一个好主意。您应该按预期异步处理 API。
快速解决此问题的方法是移动以下代码行:
question.setText(String.valueOf(fbquestions.get(0)));
在这行代码之后的回调中:
Log.v("E_Value","Question is" + quest);
你的问题将得到解决。如果您想在外面使用列表,我建议您从这篇文章中查看我的答案的最后一部分,其中我已经解释了如何使用自定义回调来完成它。您也可以观看此视频以更好地理解。
推荐阅读
- ruby - 使用相同的键将嵌套哈希与 deep_merge 合并
- c# - Razor 页面中的多个表单
- javascript - req.body 的 ES6 语法中的解构给了我整个对象而不是特定值
- python - RuntimeWarning:协程“Message.download_media”从未等待过 Telethone,Python
- javascript - 读取 JSON 文件(本地或从网络)
- xslt-2.0 - 使用模式感知 XSLT 的代码覆盖警告
- c++ - 将 const 引用绑定到右值引用
- r - 显示除最后一行以外的数据
- c# - IIS 上的 asp.net core 3.1 web api https 托管
- python - 获取不在 Python 字典中的项目