我真的很难掌握Firebase,而且无法让它发挥作用!
因此,我的Activity需要显示数据库中的Chart对象。图表在单独的类中定义。在OnCreate方法中,我执行以下操作:
Intent intent = getIntent();
chartKey = intent.getStringExtra("ChartKey");
chart = new Chart(chartKey);
chart.initialiseChart();
chartName.setText(chart.getName());
所以,我读了上一个活动传递的图表键。我用它来创建一个新的Chart对象。然后我需要使用该键从数据库中读取Chart对象并设置对象的其余部分(这是我在initialiseChart中尝试做的),然后检索Chart名称并显示它。
但是,我无法让它正常工作 - initialiseChart只返回一个只包含键集的Chart(所以与传入时相同)。
以下是我的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;
}
正如我所说,问题是,在从Activity调用'initialiseChart'之后,图表仍未设置。我猜这可能是它在从数据库中检索数据之前继续这条线路?所以我可能需要允许某种异步任务或......某事?
有人会告诉我这样做的正确方法,还是请给我一个例子?我只是围着它走了一圈,让自己感到困惑。我对Java也比较陌生,但没有帮助。我知道这可能是一件非常基本的事情,但我已经完成了文档和尽可能多的示例,并且看不到任何可以做到的事情。
答案 0 :(得分:1)
这不起作用的原因是addListenerForSingleValueEvent是Asynchronies进程。当此代码运行时:
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()); - &GT;对象图表没有准备好使用的数据。你可能会做的是添加监听器:
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
}
});