在活动和服务之间共享动态arrayList

时间:2014-07-15 01:43:12

标签: android json

我有一个Android应用程序,可以接收和处理来自传感器的数据。它包括一个主要活动类和一个服务类。服务类在后台运行,以接收和保存传感器中的数据。活动类有一个历史图表,显示最多100天前的每日平均值。活动和服务的生命周期应该是独立的,因为即使活动没有运行,服务也应该继续在后台接收数据。

这是我目前的实施。我使用共享首选项让活动访问服务中的数据。每次新数据到达时,服务都会将数据放入arrayList,然后将arrayList序列化为json并将json保存到共享首选项中。这不是很有效,因为每当我想保存新数据时,我需要从首选项中获取整个json数组,反序列化它,添加数据,然后将json数组放回去。我知道可能有办法将新的json对象附加到json数组字符串而不反序列化但我还没弄清楚如何。然而,即使这是可行的,我认为它仍然没有效率,因为整个json数组仍然需要从首选项中检索并需要为此本地对象分配内存。此外,在更新图形时,仍然需要对整个json进行反序列化。

所以我想是否有办法将数组列表保留为服务的一个字段,让主活动直接访问该字段。我做了很多搜索,但没有找到一个好的解决方案。这听起来可能是一个愚蠢的问题,但任何帮助都是值得赞赏的,因为我对Android非常陌生。另外,我一般都想知道哪种实施方式更受欢迎,以及是否有更好的解决方案?感谢您的帮助。

2 个答案:

答案 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();

这种方法的好处:

  1. 只有在打开活动时才需要从数据库访问数据。其余的时间,只要收到新的传感器值,您只需将其保存到sqlite db。
  2. 图表总是实时更新。