我有一个Android应用程序,可以接收和处理来自传感器的数据。它包括一个主要活动类和一个服务类。服务类在后台运行,以接收和保存传感器中的数据。活动类有一个历史图表,显示最多100天前的每日平均值。活动和服务的生命周期应该是独立的,因为即使活动没有运行,服务也应该继续在后台接收数据。
这是我目前的实施。我使用共享首选项让活动访问服务中的数据。每次新数据到达时,服务都会将数据放入arrayList,然后将arrayList序列化为json并将json保存到共享首选项中。这不是很有效,因为每当我想保存新数据时,我需要从首选项中获取整个json数组,反序列化它,添加数据,然后将json数组放回去。我知道可能有办法将新的json对象附加到json数组字符串而不反序列化但我还没弄清楚如何。然而,即使这是可行的,我认为它仍然没有效率,因为整个json数组仍然需要从首选项中检索并需要为此本地对象分配内存。此外,在更新图形时,仍然需要对整个json进行反序列化。
所以我想是否有办法将数组列表保留为服务的一个字段,让主活动直接访问该字段。我做了很多搜索,但没有找到一个好的解决方案。这听起来可能是一个愚蠢的问题,但任何帮助都是值得赞赏的,因为我对Android非常陌生。另外,我一般都想知道哪种实施方式更受欢迎,以及是否有更好的解决方案?感谢您的帮助。
答案 0 :(得分:0)
为什么不使用sqlite3来保存数据?当新数据到达时,您可以将其保存到sqlite3。当你想在活动中显示它们时,你只需要从数据库中读取,甚至可以选择要显示的记录。
答案 1 :(得分:0)
更好的方法是使用sqlite和广播接收器的组合。每当有新数据到达时,您都会将其保存到sqlite数据库并触发广播。
每当检索到新的传感器值时,都会触发自定义广播:
Intent newSensorValues = new Intent("NEW_SENSOR_VALUE");
//Add the new sensor values as extras to the intent.
newSensorValues.putExtra..
...
sendBroadcast(newSensorValues);
//You'll also want to save the data to the sqlite database here.
saveToDb();
为什么要点播广播 - 每当活动在屏幕上时,都要从服务更新活动。
在您要显示图表的活动中,注册“NEW_SENSOR_VALUE”类型的BroadcastReceiver
。因此,每当我们获得新广播时,您只需使用意图中传递的数据来更新地图。您还将在活动的onPause()
内取消注册接收器,以便在活动暂停时不会更新地图。
//Inside onResume() :
this.registerReceiver(newSensorValueReceiver, new IntentFilter(
"NEW_SENSOR_VALUE"));
//Inside onPause() :
this.unregisterReceiver(newSensorValueReceiver);
//Broadcast Receiver Class.
private BroadcastReceiver newSensorValueReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
intent.getExtra...
updateGraph();
}
};
活动内部onCreate()
:
fetchValueFromDb();
updateGraph();
这种方法的好处: