ArrayList를 확장하는 사용자 정의 객체에 이벤트의 영구 로그를 유지하는 Android 앱이 있습니다. 싱글 톤으로 유지되므로 다양한 활동이 모두 동일한 로그를 가리 킵니다. 주 활동은 onResume의 목록을 다시로드합니다.새 인스턴스를 만들지 않고 디스크에서 Java 객체를 다시로드 하시겠습니까?
문제는 로그를 다시로드 할 때 ArrayAdapter와 같은 모든 UI 요소가 참조를 잃어 버리고 다시 설정해야한다는 것입니다. 그것은 작동합니다. 그러나 그것은 많은 일처럼 보입니다.
원래 개체의 인스턴스에 개체를 다시로드 할 수 있도록하려면 어떻게해야합니까? 다시 설치하지 않아도됩니다. 싱글 톤을 사용하면 쉽게 열심히하지 않아야합니다.
나는 통과를 통해 모든 문제를 알고 있습니다. 그러나 나는 단지 그 주위에 내 머리를 얻을 수 없습니다.
자바가 제 첫 번째 언어가 아닙니다 ... 감사합니다.
활동에서 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);
Persister :
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();
}
}
그것은 바이 패스 reference_와 _problem 수 없다 자바 패스별로 값이다. 객체를 직렬화하는 대신 String 항목을 하나씩 직렬화하는 것이 어떻습니까? –
"싱글 톤"은 실제로 싱글 톤을 사용하는 경우 더 쉽게 만들 수 있습니다. Persister로 새로운 인스턴스를 다시 만들므로 물론 모든 객체가 새 참조를 인식하도록해야합니다. –
@JasonC 바로 그 대답에 대해 설명했습니다. –