0

ライブラリ プロジェクトからメソッドを作成して呼び出すメソッドがあります。ライブラリ メソッドは、リソースからデータを読み込みます。私はこれをワーカー スレッドで行い、その間は決して UI に触れません。(ワーカー スレッドで) 呼び出しを行うメソッドは次のとおりです。

private void testGetXData(){

try {

    Data data = new Data();
    String xsd = data.getXSD();
    importedData = xsd;

} catch (Exception e) {
    System.out.println(e.getMessage(););
}

}

例外は次の行で発生します。

Data data = new Data();

Data私のライブラリプロジェクトのクラスです。importedDataモジュールレベルの文字列です。

編集

ハンドラーを直接使用していません。メソッドを呼び出すために私がすることは次のとおりです。

new Thread(new Runnable() {
    public void run() {
        testGetXData();
    }
}).start();

UIスレッドをブロックして恐ろしいANRメッセージを取得しないように、私はこのようにしています. 完全を期すために、サービスと共有するためにリソースをライブラリに移動しました。リソースがアプリケーション プロジェクトにある場合、これは正常に機能しました。ライブラリプロジェクトに移動してから、この例外がスローされるようになりました。

さらに

ワーカー スレッドの使用をコメント アウトし、メイン スレッドで呼び出しを実行すると、機能します。ただし、バックグラウンド スレッドでこれを実行したいのですが、それでも例外がスローされます。

4

2 に答える 2

0

メッセージは現在のスレッドのハンドラーを取得しようとして失敗すると思います。スレッド上にハンドラーを作成できるようにするには、ルーパーが必要であり、デフォルトの「スレッド」実装にはルーパーがありません。

Threadの代わりにHandlerThreadを拡張すると、問題が修正されるはずです。

于 2012-12-20T16:31:01.903 に答える
0

new Handler()aを指定せずに言うと、現在のスレッドのLooperを取得しようとします。Looper通常のワーカー スレッドにはルーパーがありません。

は、sLooperを処理するスレッドMessage/ s を実行するRunnableスレッドを決定します

どちらか

new Handler(Looper.getMainLooper());

UI スレッドでメッセージを処理する場合、またはメッセージを処理できる追加のスレッドを作成する場合。HandlerThreadたとえば、ハンドラーで実行されているコードからの Android ANR を参照してください。

新しいメッセージが処理されるのを待つことによってLooperルーパーがメソッドを占有するため、ワーカー スレッド内に を含めることはできないことに注意してください。run

于 2012-12-20T16:45:35.087 に答える