1

現在、1 つのプロジェクトを復活させようとしています。getMainLooper() で例外が発生しました...

MainLooper の初期化に問題があるのではないかと考え、その前に Looper.prepareMainLoop() を追加しました。

そのオブジェクトのルーパーが既にスローされていることを示す例外...

次に、 getMainLooper() を Looper.myLooper() に置き換えようとしましたが、うまくいきました...

しかし、私は理由を理解していませんでした=)

実際、私はこの2つの違いを理解していません。私のプロジェクトで getMainLooper() が使用された場所は、アプリケーションの真のメイン ルーパーに最適な場所だと思いますが、得たものは得られました..

説明してください。

ご清聴ありがとうございました

4

1 に答える 1

10

違いはLooper.prepareMainLooper()、メインUIスレッドでルーパーを準備することです。Androidアプリケーションは通常、この関数を呼び出しません。メインスレッドでは、最初のアクティビティ、サービス、プロバイダー、またはブロードキャストレシーバーが開始されるずっと前に、ルーパーが準備されています。

しかし、現在のスレッドでLooper.prepare()準備します。Looperこの関数が呼び出された後、スレッドはsLooper.loop()を使用してメッセージの処理を開始するために呼び出すことができますHandler

したがって、あなたの場合、XとYの2つのスレッドがあります。Xスレッドは、Androidによってルーパーがすでに準備されているメインのUIスレッドです。Yスレッドにいて、呼び出しLooper.prepareMainLooper()ているときは、Xスレッド(メインスレッド)でルーパーを準備しようとしています。Xのルーパーはすでに準備されているため、これは失敗します。ただしLooper.prepare()、Yスレッドで呼び出すと、実際にはYスレッドでルーパーを準備しているため、を呼び出す準備ができていますLooper.loop()

于 2011-07-20T17:45:13.000 に答える