在不创建新实例的情况下从磁盘重新加载java对象?

时间:2013-08-15 14:05:10

标签: java android android-activity android-adapter

我有一个Android应用程序,它在一个扩展ArrayList的自定义对象中保存事件的持久日志。它保存在单个中,以便各种活动都指向同一个日志。主要活动重新加载onResume中的列表。

问题是,当我重新加载日志时,所有UI元素(如ArrayAdapter)都会丢失引用,我需要再次设置它们。有用。但是,这似乎很多工作。

如何将对象重新加载到原始对象的实例中,以便我不必再次进行所有设置?使用单身人士应该更容易而不是更难。

我知道传递引用都是一个问题。但我无法理解它。

Java不是我的第一语言...谢谢。

活动onCreate:

dataLog = DataLog.getInstance();
logView = (ListView) findViewById(R.id.logView);
dataLogAdapter = new ArrayAdapter<String>(this,R.layout.log_row, dataLog);        
logView.setAdapter(dataLogAdapter);

活动onResume:

dataLog = Persister.recoverLog(this, "datalog.dat");
dataLogAdapter = new ArrayAdapter<String>(this,R.layout.log_row, dataLog);
logView.setAdapter(dataLogAdapter);

持留:

public static DataLog recoverLog(Context context, String fileName){
File file = context.getFileStreamPath(fileName);
DataLog obj = new DataLog ();

if(file.exists() && file.length()>0){
    FileInputStream fis = null;
    ObjectInputStream ois = null;
    try {
        fis = new FileInputStream(file);
        ois = new ObjectInputStream(fis);
        obj = (DataLog) ois.readObject();
        ois.close();
        fis.close();
    } catch (IOException ex) {
        ex.printStackTrace();
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    }
}
return obj;
}

数据记录:

public class DataLog extends ArrayList<String> implements Serializable {
    private static final long serialVersionUID = 0L;
    public DataLog() {}

    private static DataLog _instance;
    public static DataLog getInstance() {
        if(_instance==null){
            _instance = new DataLog();
        }
        return _instance;
    }

    public boolean add(String entry) {
        super.add(entry);
        return true;
    }

    public void add(int index, String entry) {
        if (index > 0)
            super.add(index, entry);
        else
            super.add(entry);
    }

    public void clear() {
        super.clear();
    }

}

1 个答案:

答案 0 :(得分:0)

您的数据记录不是真正的单身人士。如果是,在第一次创建之后不会创建新的引用。

此:

dataLog = Persister.recoverLog(this, "datalog.dat");

不应该返回Datalog但是一些内部数据DataLog使用(字符串的ArrayList)并且应该在DataLog

中调用

然后传递dataLog实例。如果您重新分配它,您将遇到问题。当您重新加载数据日志时,您需要重新加载依赖于DataLog的数组实例的结构。

如有必要,请处理DataLog onResume中的DataLog.getInstance().load(); 数据,但请执行以下操作:

DataLog

这样就不会重新分配您的数据日志。这是关键。 DataLog是数据的包装器。如果更改了DataLog的内部状态,则不会丢失对public class DataLog implements Serializable { //internalize this data. private ArrayList<String> data; private static final long serialVersionUID = 0L; //singleton's constructor should be private. private DataLog() {} private static DataLog _instance; public static DataLog getInstance() { if(_instance==null){ _instance = new DataLog(); } return _instance; } public ArrayList<String> getData(){ //copy this if you're worried about it being modified. //DO NOT pass this reference around. Pass a reference to data log, //reload GUI relying on this reference as needed. return data; } public void load(){ data = //reload string array from disk. } public boolean add(String entry) { super.add(entry); return true; } public void add(int index, String entry) { if (index > 0) data.add(index,entry); else data.add(entry); } public void clear() { data.clear(); } } 的引用。

以下是一个例子:

{{1}}