可能重复:
RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
我在Android中使用Java Serialization机制时遇到问题。它从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反序列化大约4s而二进制反序列化小于0.5s),因此不反序列化此对象是我宁愿避免的选项。我知道可以重新设计我们的应用程序,但由于项目限制,以及它的极端和不必要的复杂性,这不是一个真正的选择。每一个更大的变化都是非常痛苦的。
所以当问题更清楚时 - 是否有人有想法?
感谢您的任何建议。
答案 0 :(得分:0)
尝试在代码前调用Loooper.Prepare();
Looper.Loop();
之后,世界对我来说。
类似的东西:
Looper.Prepare();
//your code
Looper.Loop();
答案 1 :(得分:0)
你不能在任何其他线程中进行ui操作 所有ui操作都应该在mainthread上
你可以用这个
runOnUiThread(new Runnable() {
@Override
public void run() {
code here
}
});