如何在后台线程中反序列化Activity对象?

时间:2012-05-21 09:38:14

标签: android android-activity deserialization background-thread

  

可能重复:
  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),因此不反序列化此对象是我宁愿避免的选项。我知道可以重新设计我们的应用程序,但由于项目限制,以及它的极端和不必要的复杂性,这不是一个真正的选择。每一个更大的变化都是非常痛苦的。

所以当问题更清楚时 - 是否有人有想法?

感谢您的任何建议。

2 个答案:

答案 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

        }
    });