web-dev-qa-db-ja.com

Android-myLooper()対getMainLooper()

明確にしますが、AndroidアクティビティでLooper.myLooper()Looper.getMainLooper()を呼び出すと、メインスレッドで同じ参照が返されます。同じですか? ?通常Androidがこれを処理するため、これらを呼び出す必要がないことはわかっていますが、メインスレッドから呼び出された場合の違いを知りたいですか?

メインスレッドから私が呼び出す場合

Looper.myLooper().quit();
// or
Looper.getMainLooper().quit();

それらは両方とも同じランタイム例外を与えるので、私はそれらが同じ参照であると仮定しています:

原因:Java.lang.RuntimeException:メインスレッドの終了が許可されていません。

誰か確認できますか?

14
j2emanue

あなたはそれをドキュメントで説明しています:

getMainLooper()

アプリケーションのメインスレッドにあるアプリケーションのメインルーパーを返します。

myLooper()

現在のスレッドに関連付けられているLooperオブジェクトを返します。呼び出しスレッドがルーパーに関連付けられていない場合は、nullを返します。

GetMainLooper()が役立っているかどうかに関しては、私はそれが本当に役立っていることを保証できます。バックグラウンドスレッドでコードを実行し、UIスレッドでコードを実行する場合は、 UIを更新するには、次のコードを使用します。

new Handler(Looper.getMainLooper()).post(new Runnable() {
  // execute code that must be run on UI thread
});

もちろん、それを達成する他の方法があります。

別の用途は、現在実行されているコードがUIスレッドで実行されているかどうかを確認する場合です。あなたは投げたい/主張したい:

boolean isUiThread = Looper.getMainLooper().getThread() == Thread.currentThread();

または

boolean isUiThread = Looper.getMainLooper().isCurrentThread();
22
marcinj

Looper.getMainLooper()は、アクティビティのメインスレッドにアタッチされているルーパーを取得するための便利なAPIです。バックグラウンドスレッドからメインスレッドのコードを実行する場合に便利です。

通常、次のように使用されます。

_new Handler(Looper.getMainLooper()).post(task);
_

Looper.myLooper()は、現在のスレッドに接続されているルーパーを取得するためのAPIです

4
rupesh jain

これら2つのメソッドをmain threadで呼び出すと、同じオブジェクトになります。 ActivityThread.JavaLooper.JavaThreadLocal.Javaのソースコードで回答を見つけることができます。

2
ttdevs