【问题标题】:How to deserialize Activity object in a background thread? [duplicate]如何在后台线程中反序列化 Activity 对象? [复制]
【发布时间】: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


【解决方案1】:

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

类似:

Looper.Prepare();
//your code
Looper.Loop();

【讨论】:

  • 我尝试了你的建议,但问题是,我调用 Looper.Prepare() 和 Looper.Loop() 的线程无法通过我调用 Looper.Loop() 的行(在调试器中它说“踩”,它不会通过线)
  • 但是对象序列化正确,并且没有任何异常,所以这可能是个好方法。
【解决方案2】:

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

你可以用这个

   runOnUiThread(new Runnable() {

        @Override
        public void run() {
            code here

        }
    });

【讨论】:

  • 序列化不是 UI 操作。序列化对象时我不更新我的 UI。
  • 同意,但您可能会在此处访问与您的 ui 部分相关的内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多