明確にしますが、AndroidアクティビティでLooper.myLooper()
とLooper.getMainLooper()
を呼び出すと、メインスレッドで同じ参照が返されます。同じですか? ?通常Androidがこれを処理するため、これらを呼び出す必要がないことはわかっていますが、メインスレッドから呼び出された場合の違いを知りたいですか?
メインスレッドから私が呼び出す場合
Looper.myLooper().quit();
// or
Looper.getMainLooper().quit();
それらは両方とも同じランタイム例外を与えるので、私はそれらが同じ参照であると仮定しています:
原因:Java.lang.RuntimeException:メインスレッドの終了が許可されていません。
誰か確認できますか?
あなたはそれをドキュメントで説明しています:
アプリケーションのメインスレッドにあるアプリケーションのメインルーパーを返します。
現在のスレッドに関連付けられている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();
Looper.getMainLooper()
は、アクティビティのメインスレッドにアタッチされているルーパーを取得するための便利なAPIです。バックグラウンドスレッドからメインスレッドのコードを実行する場合に便利です。
通常、次のように使用されます。
_new Handler(Looper.getMainLooper()).post(task);
_
Looper.myLooper()
は、現在のスレッドに接続されているルーパーを取得するためのAPIです
これら2つのメソッドをmain thread
で呼び出すと、同じオブジェクトになります。 ActivityThread.Java
、Looper.Java
、ThreadLocal.Java
のソースコードで回答を見つけることができます。