如何在Android中有效地保存对象

时间:2015-09-04 15:58:13

标签: android json database object sharedpreferences

我有一个对象,我现在使用SharedPreferences这样保存:

  public String getActiveTripString(Context con) {
    return preferences.getString(ACTIVE_TRIP, "-1");
}
   public void setActiveTripString(Context context, String string) {
    setString(context, string, ACTIVE_TRIP);
}
public PSTrip getActiveTrip(Context context) {
    String active = getActiveTripString(context);
    PSTrip psTrip = null;
    if (active.contentEquals("-1")) {
        return null;
    } else {
        try{
            psTrip = JsonUtil.jsonToObject(active, PSTrip.class);
        }catch (Exception e){
            Log.i("","getActiveTrip error is:" + e.getMessage());
        }
        return psTrip;
    }
}

public void setActiveTrip(PSTrip psTrip, Context context) {
    try{
        setActiveTripString(context, JsonUtil.objectToJson(psTrip, PSTrip.class));
    }catch (Exception e){
        Log.i("","setActiveTrip error is:" + e.getMessage());
    }
}

我可以看到有功能,创建一个json,然后将其保存为SharedPrefferences中的字符串。但是对象很大,我加入的越多,应用程序开始变得更加迟钝,直到它没有响应。 我还需要在很多地方使用这个对象,所以我总是需要调用: GetActiveTrip获取它,进行修改,然后使用SetActiveTrip保存它。 我正在寻找一种更有效的方法来保存它。我尝试使用REALM,将其保存在数据库中,但由于我的对象太大了,并且在很多地方进行了修改,我还没有完全成功地工作,只需要调用Realm就可以在数据库,为了拥有托管数据库项,所以我可以将它们添加到我的对象中,依此类推。我认为这可能是内存消耗。并且它与领域异常崩溃很多。 我能用其他任何方式吗?保存到文件比共享首选项更有效吗?正如我在Android Monitor中看到的,分析我的跟踪,创建JSON的GSON函数需要大量资源。 有什么建议我可以使用吗?

编辑:我的目标:

public class PSTrip extends RealmObject {
private boolean valid;
private String type;
private String travel_mode;
@PrimaryKey
private String id;
private Owner_data owner_data;
private int distance;
private String name;
private double checkinLat;
private double checkinLng;
private double checkoutLng;
private double checkoutLat;
private String icon;
private String status;
private Destination destination;
private int checkout_time;
private int checkin_time;
private Route route;
private String owner;
private String vehicle;
private Flight flight;
@SerializedName("last_updated")
private int lastUpdated;
@SerializedName("steps")
private RealmList<TripStep> tripSteps;
private RealmList<Record> records;
@SerializedName("planned_route")
private Planned_Route plannedRoute;
private Group group;
private float emissions;
private Co2PerKm co2_per_km;
private int update_interval;
private boolean isRoaming = false;

public boolean getIsRoaming() {
    return isRoaming;
}

public void setIsRoaming(boolean isRoaming) {
    this.isRoaming = isRoaming;
}

public Group getGroup() {
    return group;
}

public void setGroup(Group group) {
    this.group = group;
}

public int getLastUpdated() {
    return lastUpdated;
}

public void setLastUpdated(int lastUpdated) {
    this.lastUpdated = lastUpdated;
}

public RealmList<TripStep> getTripSteps() {
    return tripSteps;
}

public void setTripSteps(RealmList<TripStep> steps) {
    this.tripSteps = steps;
}

public String getVehicle() {
    return vehicle;
}

public void setVehicle(String vehicle) {
    this.vehicle = vehicle;
}

public Flight getFlight() {
    return flight;
}

public void setFlight(Flight flight) {
    this.flight = flight;
}

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}

public String getTravel_mode() {
    return travel_mode;
}

public void setTravel_mode(String travel_mode) {
    this.travel_mode = travel_mode;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public Owner_data getOwner_data() {
    return owner_data;
}

public void setOwner_data(Owner_data owner_data) {
    this.owner_data = owner_data;
}

public int getDistance() {
    return distance;
}

public void setDistance(int distance) {
    this.distance = distance;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getIcon() {
    return icon;
}

public void setIcon(String icon) {
    this.icon = icon;
}

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

public Destination getDestination() {
    return destination;
}

public void setDestination(Destination destination) {
    this.destination = destination;
}

public int getCheckout_time() {
    return checkout_time;
}

public void setCheckout_time(int checkout_time) {
    this.checkout_time = checkout_time;
}

public int getCheckin_time() {
    return checkin_time;
}

public void setCheckin_time(int checkin_time) {
    this.checkin_time = checkin_time;
}

public Route getRoute() {
    return route;
}

public void setRoute(Route route) {
    this.route = route;
}

public String getOwner() {
    return owner;
}

public void setOwner(String owner) {
    this.owner = owner;
}

public PSTrip() {
}

public PSTrip(String id) {
    this.id = id;
}

public double getCheckoutLng() {
    return checkoutLng;
}

public void setCheckoutLng(double checkoutLng) {
    this.checkoutLng = checkoutLng;
}

public double getCheckinLat() {
    return checkinLat;
}

public void setCheckinLat(double checkinLat) {
    this.checkinLat = checkinLat;
}

public double getCheckinLng() {
    return checkinLng;
}

public void setCheckinLng(double checkinLng) {
    this.checkinLng = checkinLng;
}

public double getCheckoutLat() {
    return checkoutLat;
}

public void setCheckoutLat(double checkoutLat) {
    this.checkoutLat = checkoutLat;
}

public boolean isRoaming() {
    return isRoaming;
}

public void setRoaming(boolean isRoaming) {
    this.isRoaming = isRoaming;
}

public Planned_Route getPlannedRoute() {
    return plannedRoute;
}

public void setPlannedRoute(Planned_Route plannedRoute) {
    this.plannedRoute = plannedRoute;
}

public boolean isValid() {
    return valid;
}

public float getEmissions() {
    return emissions;
}

public void setEmissions(float emissions) {
    this.emissions = emissions;
}

public Co2PerKm getCo2_per_km() {
    return co2_per_km;
}

public void setCo2_per_km(Co2PerKm co2_per_km) {
    this.co2_per_km = co2_per_km;
}

public void setValid(boolean valid) {
    this.valid = valid;
}

public int getUpdate_interval() {
    return update_interval;
}

public void setUpdate_interval(int update_interval) {
    this.update_interval = update_interval;
}

public RealmList<Record> getRecords() {
    return records;
}

public void setRecords(RealmList<Record> records) {
    this.records = records;
}
}

其中:路线,目的地是谷歌地图对象,如果您熟悉它们,您就会知道它们包含的内容及其大小; TripStep =与google BUT中的STEP对象类似,它包含2个数组:

private RealmList<StopInfo> filteredLocations = new RealmList<>();
private RealmList<StopInfo> rawLocations = new RealmList<>();

我必须在rawLocations中每5-6秒添加一个新位置。 每次我获得的rawlocation比我上次获得的rawLocation的距离x米时,添加一个新位置。 从首选项获取对象,反序列化,获取最新的TripStep并将新位置添加到filteredLocations和rawLocations似乎记录了内存。所以这就是我认为的问题

1 个答案:

答案 0 :(得分:0)

毕竟,我选择使用Realm,而不是共享首选项,它更有效率,即使我对我的文件所做的更改仍有一些问题,我也很快就会找到稳定的版本。 它有它的缺点(一些REALM对象没有被GSON正确序列化,你需要使用jackson,也不能使用你的模型中的函数,或者它只支持原语是一个很大的问题,但如果你设法过了这个,这是值得的) 不建议将Realm数据库添加到已经很大的项目