1

可能重复:
RuntimeException:无法在未调用 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 秒),我宁愿避免不反序列化这个对象。我知道重新设计我们的应用程序是可能的,但由于项目限制,而且它极端且不必要的复杂性,这不是一个真正的选择。每一次更大的改变都是极其痛苦的。

所以当问题不太清楚时 - 有没有人有一些想法?

感谢您的任何建议。

4

2 回答 2

0

您不能在任何其他线程中执行 ui 操作所有 ui 操作都应该在主线程上

你可以用这个

   runOnUiThread(new Runnable() {

        @Override
        public void run() {
            code here

        }
    });
于 2012-05-21T10:11:44.967 回答
0

尝试Loooper.Prepare();在您的代码之前和 Looper.Loop();之后打电话,为我工作。

就像是 :

Looper.Prepare();
//your code
Looper.Loop();
于 2012-05-21T09:52:31.960 回答