Hy Developers ,我是android开发的新手,所以这就是为什么将数据保存和查看到我的android应用程序中的问题。
我知道只有在您连接到互联网时才能检索数据。
但是问题是它正在检索数据并向Android日志显示。
但是当我尝试将其保存到字符串变量或arraylist以显示时 使用该列表或变量将其用于主要活动,则无法正常工作。
我要声明一个私有字符串变量,以便在onCreate方法之前存储Firebase数据库中的值。
很抱歉我的nob问题。但这是我面临的问题。
以下是我正在使用的代码和一些屏幕截图,使问题易于理解。
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后,应用程序崩溃。
答案 0 :(得分:1)
您不能简单地在fbquestions.get(0)
方法之外获取onDataChange()
的值,因为该方法具有异步行为。因此,您不能简单地将fbquestions
列表创建为全局变量并在callbakc之外使用它的值,因为它始终是empty
。基本上,您正在尝试从异步的API同步使用值。那不是一个好主意。您应该按预期异步处理API。
对此问题的快速解决方案是移动以下代码行:
question.setText(String.valueOf(fbquestions.get(0)));
在此代码行之后的回调内:
Log.v("E_Value","Question is" + quest);
您的问题将得到解决。如果要在外部使用列表,建议您从此 post 中查看anwser的最后一部分,其中我已经解释了如何使用自定义回调来完成。您也可以查看此 video 以获得更好的理解。
答案 1 :(得分:0)
将任务值传递给Textview。
ArrayList<String> questionArrrayList =new Arraylist<>();
questionArrrayList .clear();
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Map <String, String> map = (Map)dataSnapshot.getValue();
quest = map.get("question");
question.setText(quest);
questionArrrayList .add(quest);
Log.v("E_Value","Question is" + quest);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});