Android Firebase答题应用:Activity创建时ArrayList长度为0
问题分析与解决建议
问题根源
Firebase的addListenerForSingleValueEvent是异步执行的,你在onCreate里直接调用loadnewquestion()时,Firebase还没完成数据拉取,questionlists自然是空的。而重启测验时,之前的异步请求已经把数据加载到questionlists里了,所以能正常显示题目。
解决步骤
- 延迟初始化题目:把
loadnewquestion()移到onDataChange方法内部,确保数据加载完成后再渲染题目。 - 添加加载失败处理:在
onCancelled里提示用户加载出错,避免用户一直等待加载弹窗。 - 空列表防护:在
loadnewquestion里先判断列表是否为空,避免数组越界崩溃。
修改后的关键代码
DatabaseReference databaseReference= FirebaseDatabase.getInstance().getReference(); databaseReference.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { for(DataSnapshot dataSnapshot : snapshot.child("Python").getChildren()){ String questions=dataSnapshot.child("question").getValue(String.class); String getansa = dataSnapshot.child("option1").getValue(String.class); String getansb = dataSnapshot.child("option2").getValue(String.class); String getansc = dataSnapshot.child("option3").getValue(String.class); String getansd = dataSnapshot.child("option4").getValue(String.class); String getans = dataSnapshot.child("answer").getValue(String.class); Questionlist questionlist = new Questionlist(questions,getansa,getansb,getansc,getansd,getans); questionlists.add(questionlist); } progressDialog.hide(); // 数据加载完成后再初始化题目 loadnewquestion(); } @Override public void onCancelled(@NonNull DatabaseError error) { progressDialog.hide(); // 提示加载失败 Toast.makeText(Python.this, "题目加载失败,请检查网络", Toast.LENGTH_SHORT).show(); } }); // 移除原来onCreate里的loadnewquestion()调用
修改loadnewquestion方法,增加空列表判断:
private void loadnewquestion() { tq=questionlists.size(); totalquestions.setText("Total Questions: "+tq); // 列表为空时直接返回,避免崩溃 if(tq == 0){ Toast.makeText(this, "暂无题目数据", Toast.LENGTH_SHORT).show(); return; } if(currentquestionindex == tq){ finishquiz(); return; } question.setText(questionlists.get(currentquestionindex).getQuestion()); ansa.setText(questionlists.get(currentquestionindex).getOption1()); ansb.setText(questionlists.get(currentquestionindex).getOption2()); ansc.setText(questionlists.get(currentquestionindex).getOption3()); ansd.setText(questionlists.get(currentquestionindex).getOption4()); }
数据库结构截图

内容的提问来源于stack exchange,提问作者settipalli sudheendra
相关产品推荐
相关产品推荐

