我在 Android 中使用 Java 序列化机制时遇到问题。从 UI 线程调用时它运行良好,但是当我尝试从某个后台线程使用它时,我得到:
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
由于项目性质,我无法反序列化 UI 线程中的所有内容(也应该可以在后台进行,因此 UI 不会停止响应)。
顺便提一句。当我尝试使用 SimpleXML 在后台反序列化某些内容时,也会发生同样的事情。
所以现在我们从不能在任何地方使用的 UI 线程进行反序列化(XML 和 Java 序列化)。
任何人都可以对这个问题有所了解吗?
编辑:
我正在使用以下代码来反序列化一个对象,它在从 UI 线程调用时运行良好。
public Object getObject(String key) throws InvalidClassException {
Object result;
try {
FileInputStream fileIn = context.openFileInput(getPath(key));
ObjectInputStream in = new ObjectInputStream(fileIn);
result = in.readObject();
in.close();
fileIn.close();
} catch (InvalidClassException e) {
throw new InvalidClassException(e.getMessage());
} catch (IOException e) {
throw new RuntimeException(e);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
return result;
}
编辑 2
正如下面的 EJP 评论中提到的,我正在反序列化一个 Activity 对象。所以我将我的问题更改为:如何在后台线程中反序列化 Activity 对象?由于性能问题(XML 反序列化大约需要 4 秒,而二进制反序列化少于 0.5 秒),我宁愿避免不反序列化这个对象。我知道重新设计我们的应用程序是可能的,但由于项目限制,而且它极端且不必要的复杂性,这不是一个真正的选择。每一次更大的改变都是极其痛苦的。
所以当问题不太清楚时 - 有没有人有一些想法?
感谢您的任何建议。