把头靠在墙上。我正在从Blackberry转换到Android。
我有一个需要保留日志的应用。它是一个简单的ArrayList,并不会那么大。它确实需要在应用程序重新启动之间保持等等。但它不够复杂,无法使用SQL。它需要在ListView中显示,因此ArrayList看起来最简单。
我似乎能够轻松地序列化和存储ArrayList。但是在读回来的时候,它就是炸弹,说我无法从Object转换为ArrayList。
我的计划是在获取实例时让日志对象(singleton)加载历史记录。然后我会用onDestroy()...
写一个文件在黑莓手机上,这种事情很简单。我很惊讶你需要在Android上做多少工作。 Android上的其他所有内容似乎都更容易。我更喜欢将对象标记为Persistent并让系统为我管理它的方法。我知道你也不能轻易地将一个Object填充到SharedPreference中。
有人可以指出我哪里出错吗?我已经用几种方式重新布线了,但问题仍然存在。如果有更简单的方法,请告诉我们。
由于
我有:
public class DataLog implements Serializable {
private static final long serialVersionUID = 0L;
private static String fileName = "datalog.dat";
private static ArrayList<String> log = null;
static public ArrayList<String> getInstance() {
if (log == null) {
synchronized (DataLog.class) {
if (log == null) {
log = new ArrayList<String>();
}
}
load();
}
return log;
}
public DataLog() {
super();
}
public boolean add(String entry) {
return log.add(entry);
}
public void add(int index, String entry) {
if (index > 0)
log.add(index, entry);
else
log.add(entry);
save();
}
public void clear() {
log.clear();
}
public void save() {
Persister.store(fileName, log);
}
public static void load() {
log = (ArrayList<String>) Persister.restore(fileName);
}
}
和
public class Persister {
static Context context = ThisApplication.context;
public Persister() {}
public static boolean store(String fileName, Object obj){
File file = context.getFileStreamPath(fileName);
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try {
fos = new FileOutputStream(file);
oos = new ObjectOutputStream(fos);
oos.writeObject(obj);
oos.close();
fos.close();
} catch (IOException ex) {
ex.printStackTrace();
}
return true;
}
public static Object restore(String fileName){
File file = context.getFileStreamPath(fileName);
Object obj = new Object();
if(file.exists() && file.length()>0){
FileInputStream fis = null;
ObjectInputStream ois = null;
try {
fis = new FileInputStream(file);
ois = new ObjectInputStream(fis);
obj = ois.readObject();
ois.close();
fis.close();
} catch (IOException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
}
return obj;
}
}
答案 0 :(得分:0)
如果该文件不存在,那么Persister.restore
实际上会返回new Object()
,而ArrayList
不是public static ArrayList<String> restore(String fileName){
File file = context.getFileStreamPath(fileName);
ArrayList<String> obj = null; // returning null indicates error
if(file.exists() && file.length()>0){
FileInputStream fis = null;
ObjectInputStream ois = null;
try {
fis = new FileInputStream(file);
ois = new ObjectInputStream(fis);
obj = (ArrayList<String>) ois.readObject();
ois.close();
fis.close();
} catch (IOException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
} else {
obj = new ArrayList<String>();
}
return obj;
}
的实例。你可以这样做:
load()
然后,您可以从Persister.restore
消除演员阵容(因为它现在位于public static void load() {
log = Persister.restore(fileName);
}
):
Persister.store()
我还会更改ArrayList<String>
以接受明确的Object
参数,而不是普通的public static boolean store(String fileName, ArrayList<String> obj){
// method body does not need to change
}
:
ArrayList<String>
这样编译器就可以捕获任何编程错误,你尝试保留{{1}}以外的其他东西。