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

Loooper.Prepare();コードの前と 後に呼び出してみてLooper.Loop();ください。

何かのようなもの :

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

他のスレッドで ui 操作を行うことはできません。すべての ui 操作はメインスレッドで行う必要があります。

あなたはこれを使うことができます

   runOnUiThread(new Runnable() {

        @Override
        public void run() {
            code here

        }
    });
于 2012-05-21T10:11:44.967 に答える