大家好,我正在编写一个应用,该应用将读取Firebase
实时数据库中存储的数据,并使用Android Studio的libaray MPAndroidChart
用这些数据绘制折线图。
我在实时数据库上的数据正在不断获取并使用Python
脚本上传,该脚本将从串行端口收集开发板Waspmote
上的传感器数据。(部分可能与我的应用程序无关,因为数据结构已在Firebase
)
实时数据库的结构如下所示:
这是我的绘图应用程序的MainActivity
代码:
public class MainActivity extends AppCompatActivity {
private LineChart Temp_linechart;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
@Override
protected void onStart() {
super.onStart();
DatabaseReference mPostReference = FirebaseDatabase.getInstance().getReference("Indoor");
mPostReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Temp_linechart = (LineChart) findViewById(R.id.Data_of_Temp);
final ArrayList<Entry> yData = new ArrayList<>();
LineDataSet lineDataSet = new LineDataSet(yData,"Temp");
for (DataSnapshot ds : dataSnapshot.getChildren()){
Long tsLong = System.currentTimeMillis()/1000;
float SensorValue = (float)ds.child("P1").getValue();
yData.add(new Entry(tsLong,SensorValue));
}
LineData data = new LineData (lineDataSet);
Temp_linechart.setData(data);
Temp_linechart.notifyDataSetChanged();
Temp_linechart.invalidate();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Toast.makeText(MainActivity.this, "Fail to load post", Toast.LENGTH_SHORT).show();
}
});
}
}
运行代码时没有错误,但是当我打开在手机上创建的应用程序时,未显示折线图,并且该应用程序将在几秒钟后停止。显示:
sensordata_vis
已停止
好,在我应用@Umar Hussain
的方法之后。构建成功。
在run
窗口中,它显示error1 error2
在logcat
窗口中,它显示error3 error4
谢谢
最后,我已经实现了我想要的,这是我编辑的代码:
public class MainActivity extends AppCompatActivity {
private LineChart Temp_linechart;
ArrayList<Entry> yData;
DatabaseReference mPostReference;
ValueEventListener valueEventListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Temp_linechart = (LineChart) findViewById(R.id.Data_of_Temp);
mPostReference = FirebaseDatabase.getInstance().getReference("Indoor");
mPostReference.addValueEventListener(valueEventListener= new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
yData = new ArrayList<>();
float i =0;
for (DataSnapshot ds : dataSnapshot.getChildren()){
i=i+1;
String SV = ds.child("P1").getValue().toString();
Float SensorValue = Float.parseFloat(SV);
yData.add(new Entry(i,SensorValue));
}
final LineDataSet lineDataSet = new LineDataSet(yData,"Temp");
LineData data = new LineData(lineDataSet);
Temp_linechart.setData(data);
Temp_linechart.notifyDataSetChanged();
Temp_linechart.invalidate();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
答案 0 :(得分:0)
首先将您的代码移到onCreate()
之外以获取侦听器外部图表的引用。
还将MpAndroidChart初始化移动到oncreate方法中。
final ArrayList<Entry> yData;
LineDataSet lineDataSet;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Temp_linechart = (LineChart) findViewById(R.id.Data_of_Temp);
yData = new ArrayList<>();
lineDataSet = new LineDataSet(yData,"Temp");
LineData data = new LineData (lineDataSet);
Temp_linechart.setData(data);
Temp_linechart.notifyDataSetChanged();
//Temp_linechart.invalidate();
}
接下来,在值事件侦听器中,仅清除数组列表并重新填充它。并在图表上调用通知并失效。
DatabaseReference mPostReference;
ValueEventListener valueEventListener;
@Override
protected void onStart() {
super.onStart();
mPostReference = FirebaseDatabase.getInstance().getReference("Indoor");
mPostReference.addValueEventListener(valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
yData.clear();
for (DataSnapshot ds : dataSnapshot.getChildren()){
Long tsLong = System.currentTimeMillis()/1000;
float SensorValue = (float)ds.child("P1").getValue();
yData.add(new Entry(tsLong,SensorValue));
}
Temp_linechart.notifyDataSetChanged();
Temp_linechart.invalidate();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Toast.makeText(MainActivity.this, "Fail to load post", Toast.LENGTH_SHORT).show();
}
});
}
最后在onStop中删除该侦听器,因为该侦听器未与片段或活动生命周期绑定,您必须手动执行此操作。
P.S:尝试将Java中的Camelcase用作Java开发人员最常用的样式,并且对我们来说很容易阅读。