3

リモートサービスにコンテンツオブザーバーを含むアプリケーションを作成しようとしていますが、エラーが発生し続けます:

「Looperprepareを呼び出さなかったスレッド内にハンドラーを作成できません」

私はAndroidDevelopersサイトで多くの読書をしましたが、多くのGoogle検索もまだ問題を完全には理解していません。これまでのところ、コンテンツオブザーバーを実行するには(ハンドラーの)スレッドが必要です。追加後:

Looper.myLooper().prepare();
mObserver = new Observer(new Handler());

新しいコンテンツオブザーバーを作成する直前にLooperを呼び出すと、アプリケーションが正しく機能します。しかし、これがなぜであるかをよりよく理解したいと思います。オンラインで見つけたものは、これまでのところ理由を理解するのに役立ちませんでした。また、コードのLooper行を追加することは、正しく効率的なことですか?そして、後でメモリリークを防ぐために、これを使ってクリーンアップする必要がありますか?

説明は簡単な方がいいです。まだAndroid開発の最初の月で、順調に進んでいます-StackOverflowは大きな助けになりました!ありがとう。

更新
遊んでもっと読んだ後、私はこの作品を作る方法とそれをきれいにする方法をよりよく理解していると思いますが、それでも1つの小さな部分が欠けています。

私が集めたものから、静的メソッドとしてLooper.prepare()を呼び出すことができます。次に、新しいHandler()を使用してコンテンツオブザーバーを作成できます。このコンテンツオブザーバーを停止したい場合は、mLooper = Looper.myLooper.getThread()を使用してオブジェクトのスレッドを取得してから、mLooper.quit()を実行できます。ただし、必要なのはいつですか。また、なぜmLooper.loop()を呼び出すのでしょうか。

UPDATE 2
さて、ここで私が取り組んでいる問題です。アプリケーションは社内にあり、説明するのは少し複雑ですが、これが私のベストショットです。

ネットワークデータを送受信するリモートサービスを実行しています。メッセージタイプはデータで定義されているため、電話の正しいデータベースに送信できます。実行中のサービスに接続するためにインポートする他のAPK用のJarインターフェースファイルがあります。これらのAPKは、関心のある新しいメッセージが受信されたときにブロードキャストを受信するように登録できます。これを行うために、コンテンツオブザーバーはAPKが使用するコンテンツURIに登録されます。したがって、新しいデータがデータベースに追加されると、コンテンツオブザーバーはブロードキャストを送信して正しいAPKにアラートを送信します。その後、APKは必要に応じてこれを処理できます。

したがって、新しいコンテンツオブザーバーのパラメーターとしてnullを使用しても問題ありませんか、それとも新しいHandler()を使用してこのオブザーバーのスレッドを作成する方がよいでしょうか。

スレッドを作成しようとしましたが、これまでのところ機能していません。Looper.loopを開始していないためだと思います(これによりサービスがフリーズします)。アドバイスをいただければ幸いです。前もって感謝します。

4

1 に答える 1

3

スレッドでLooperを起動すると、他のスレッドがメッセージを送信できるようになり、メッセージを受信して​​処理します。このスキームはAndroidで広く使用されています。ルーパーはUIスレッドで初期化され、他のスレッドはいくつかの長い操作を実行するために割り当てられます。これらの「ワーカー」スレッドは、メッセージを投稿することで、ハードワークの結果をUIスレッドに送信できますHandler

そして、はい、あなたはLooper.loop()物事を実行させるために電話する必要があります。そうしないと、ハンドラーがイベントを受信しなくなります。Looper.quit()そして、それを停止し、リソースのリークを回避するために呼び出す必要があるようです。

そして、ここに面白い部分があります。ContentObserverのソースコードから判断すると、ハンドラーは必ずしも必要ではありません。を渡すnullと、それが実行onChange()されているのと同じスレッドで実行されます。

PS開発マシンがダウンしているため、ステートメントを確認する方法がありません。たぶん、ContentObserverの現在のバージョンでは、ハンドラーが機能する必要があります。実験が表示されます。

于 2011-10-06T15:48:32.757 に答える