首页 > 解决方案 > 如何将检索到的数据从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添加值后,应用程序崩溃..

标签: javaandroidfirebasefirebase-realtime-database

解决方案


您不能简单地获取方法fbquestions.get(0)外部的值,onDataChange()因为此方法具有异步行为。因此,您不能简单地将fbquestions列表创建为全局变量并在 callbakc 之外使用它的值,因为它始终是empty. 基本上,您正在尝试从异步 API 同步使用值。这不是一个好主意。您应该按预期异步处理 API。

快速解决此问题的方法是移动以下代码行:

question.setText(String.valueOf(fbquestions.get(0)));

在这行代码之后的回调中:

Log.v("E_Value","Question is" + quest);

你的问题将得到解决。如果您想在外面使用列表,我建议您从这篇文章中查看我的答案的最后一部分,其中我已经解释了如何使用自定义回调来完成它。您也可以观看此视频以更好地理解。


推荐阅读