java - 保存对象的数组列表,以便在应用程序重新启动时恢复它们。

标签 java android android-activity arraylist bundle

如何保存对象的数组列表,以便在应用程序重新启动时恢复它们。我尝试将其存储在 bundle 中并使用保存的实例状态恢复它,但每次重新启动应用程序时,所有数据都会消失并且从头开始(带有空列表)。

我的区域类代码是

 public class Area implements Parcelable {

// region Properties

public String id;
public String name;
public double latitude;
public double longitude;
public float radius;

// end region

// region Public
//creates a named area
public Area(String name, double latitude, double longitude, float radius){

    this.id = UUID.randomUUID().toString();
    this.name = name;
    this.longitude= longitude;
    this.latitude = latitude;
    this.radius = radius;

}
// endregion
public Area(Parcel in){
    id = in.readString();
    latitude = in.readDouble();
    longitude = in.readDouble();
    name = in.readString();
    radius = in.readFloat();

}

   //getters

public String getId(){return id;}
public double getLatitude(){return latitude;}
public double getLongitude(){return longitude;}
public float getRadius(){return radius;}
public String getName(){return name;}

    //setters

public void setName(String name){this.name = name;}
public void setLatitude(double latitude){this.latitude=latitude;}
public void setLongitude(double longitude){this.longitude=longitude;}

public void setRadius(float radius) {
    this.radius = radius;

}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(id);
    dest.writeDouble(latitude);
    dest.writeDouble(longitude);
    dest.writeString(name);
    dest.writeFloat(radius);


}
public static final Parcelable.Creator<Area> CREATOR = new Parcelable.Creator<Area>()
{
    public Area createFromParcel(Parcel in)
    {
        return new Area(in);
    }
    public Area[] newArray(int size)
    {
        return new Area[size];
    }
};

@Override
public String toString(){return this.name + "       " + this.radius;}
// endregion
}

使用此方法在包中保存和恢复

 @Override
public void onSaveInstanceState(Bundle savedInstanceState)
{
    super.onSaveInstanceState(savedInstanceState);

    // Here you can save your data
    // If you want to store your ArrayList, it should implement Parselable
    savedInstanceState.putParcelableArrayList("STORE_KEY", areas);
}

/**
 * Restoring data
 */
@Override
public void onRestoreInstanceState(Bundle savedInstanceState)
{
    super.onRestoreInstanceState(savedInstanceState);
    areas = savedInstanceState.getParcelableArrayList("STORE_KEY");
}
}

Oncreate方法是

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    areas = new ArrayList<Area>();
    if(savedInstanceState != null){
       areas = savedInstanceState.getParcelableArrayList("STORE_KEY");
    }
    if (areas.isEmpty()) {
        Log.d("area list lala", "is empty");


    }
    else {
        for (int i = 0; i < areas.size(); i++) {

            Log.d("area list lala", areas.get(i).getName());
            Log.d("area list lala", String.valueOf(areas.get(i).getRadius()));
        }

    }

还有重写的 onresume 函数

 @Override
protected void onResume() {
    super.onResume();

}

最佳答案

如何将对象存储在专为存储对象而设计的 SQLite 数据库或 db4o ( more about it ) 中。

This is关于将对象序列化为字节流的文章。

关于java - 保存对象的数组列表,以便在应用程序重新启动时恢复它们。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31710076/

相关文章:

java - @SqlBatch 在 jdbi sql 对象 api 中进行多次插入

java - "LocalBean"和 "Remote"都可以在一个 bean 上注释吗?

android - Android 中的 FFmpeg 命令以编程方式

java - Maven 可以生成模块声明吗?

java - Log4j2:切换到路由后自定义插件不起作用

java - 回收站 View : No adapter attached; skipping layout

android - 当应用程序关闭或应用程序处于后台时获得两次 GCM PUSH 通知

android - Android 上带有远程 View 的自定义通知

java - 如何在重写 Activity 的方法之一的同时启动 Activity?

java - 在 Lollipop 之前的设备上溢出点不会改变颜色