我有一个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();
}
}
答案 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}}