【发布时间】:2012-05-21 09:38:14
【问题描述】:
可能重复:
RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
我在 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 秒),我宁愿避免不反序列化这个对象。我知道重新设计我们的应用程序是可能的,但由于项目限制,而且它极端且不必要的复杂性,这不是一个真正的选择。每一次更大的改变都是极其痛苦的。
那么当问题不太清楚时 - 有人有什么想法吗?
感谢您的任何建议。
【问题讨论】:
-
没有人会用勺子喂你,也不会为你提供准确的代码。您必须根据给定的建议应用一点自己的大脑。
-
@dinesh 我能够编写自己的代码,只是征求一些建议,这里可能有什么问题。为什么这么苛刻?
-
为什么在后台线程中需要 Looper?
-
@LawrenceD'Oliveiro 我不需要它(我认为)。老实说,我没有像我想的那样得到弯针。不过,我不认为我在这里创建了任何 Looper。
标签: android android-activity deserialization background-thread