我正在尝试掌握 Firebase,但无法让它发挥作用!
因此,我的 Activity 需要显示数据库中的 Chart 对象。图表是在单独的类中定义的。在 OnCreate 方法中,我执行以下操作:
Intent intent = getIntent();
chartKey = intent.getStringExtra("ChartKey");
chart = new Chart(chartKey);
chart.initialiseChart();
chartName.setText(chart.getName());
因此,我读入了从上一个活动传递过来的图表密钥。我用它来创建一个新的图表对象。 然后我需要使用该键从数据库中读取图表对象并设置该对象的其余部分(这就是我在initialiseChart中尝试做的事情),然后检索图表名称并显示它。
但是,我无法让它正常工作-initialiseChart 返回一个仅包含键集的图表(与传入时相同)。
以下是我的 Chart 类的相关部分:
public class Chart {
private String uid, key, name, details;
public Chart() {}
public Chart(String chartKey) {
this.key = chartKey;
}
@Exclude
public Map<String, Object> toMap() {
HashMap<String, Object> result = new HashMap<>();
result.put("uid", uid);
result.put("key", key);
result.put("name", name);
result.put("details", details);
return result;
}
public String getKey() { return this.key; }
public String getUid() { return this.uid; }
public String getName() { return this.name; }
public String getDetails() { return this.details;}
public void initialiseChart() {
if(this.key == null) return;
DatabaseReference mChartReference = FirebaseDatabase.getInstance().getReference()
.child("charts").child(this.key);
mChartReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Chart chart = dataSnapshot.getValue(Chart.class);
setUpChart(chart);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private void setUpChart(Chart chart) {
this.uid = chart.uid;
this.name = chart.name;
this.details = chart.details;
}
正如我所说,问题是,从活动中调用“initialiseChart”后,图表仍然没有设置。我猜测在从数据库检索数据之前它可能会继续执行此行?所以大概我需要允许某种异步任务或......什么?
我正在寻找正确的方法来做到这一点。我只是在兜圈子,让自己感到困惑。 我对 Java 也比较陌生。我知道这可能是一件非常基本的事情,但我已经浏览了文档和尽可能多的示例,但看不到任何可以做到这一点的东西。
这不起作用的原因是 addListenerForSingleValueEvent 是异步过程。当此代码运行时:
Intent intent = getIntent();
chartKey = intent.getStringExtra("ChartKey");
chart = new Chart(chartKey);
chart.initialiseChart();
chartName.setText(chart.getName()); // here the data isn't ready yet.
chartName.setText(chart.getName()); -> 对象图表没有可供使用的数据。您可能会做的是添加侦听器:
Intent intent = getIntent();
chartKey = intent.getStringExtra("ChartKey");
chart = new Chart(chartKey);
chart.initialiseChart(new Runnable{
public void run(){
chartName.setText(chart.getName()); // this should run on ui thread
}
});