2015-12-16 110 views
6

MAINスレッドのAndroidのアクティビティで明示していますが、Looper.myLooper()とLooper.getMainLooper()を呼び出しても同じ参照が返されますか?彼らは同じことですか?私はアンドロイドがこれを処理するので、私はこれらを通常は呼び出す必要はないことを知っていますが、メインスレッドから呼び出されたときにそれらがどのように異なるかを知りたいですか?Android - myLooper()vs getMainLooper()

私は、彼らは同じ参照されていると仮定するとイムので、彼らの両方が同じ実行時例外を与える

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

を呼び出してメインスレッドからの場合:

Caused by: java.lang.RuntimeException: Main thread not allowed to quit. 

は誰でも確認することができますか?

答えて

13

を添付取得するためのAPIです:

getMainLooper()

アプリケーションのメインルーパーを返します。メインルーパーはメインスレッドアプリケーションの広告。

myLooper()

戻り

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

getMainLooper()が何らかの用途に使用されているかどうかは、本当にわかります。バックグラウンドスレッドでコードを実行し、UIスレッドでコードを実行する場合は、次のようにします。 UIを更新するには、次のコードを使用してください:

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

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

現在実行されているコードがUIスレッドで実行されているかどうかを確認する場合はもう1つの方法があります。あなたは主張/スローにしたい:あなたはmain threadでこれらの2つのメソッドを呼び出す場合

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

または

boolean isUiThread = Looper.getMainLooper().isCurrentThread(); 
+0

私はこれを試して、それは動作します。ハンドラがデフォルトのメッセージを使用する代わりに、メッセージを送信するためのキューを渡すことをお勧めします。私は、コンストラクタがこれらの過負荷を抱えているのを見たことはありません – j2emanue

3

Looper.getMainLooper()は、アクティビティのメインスレッドに添付されているルーパーを取得する便利なAPIです。バックグラウンドスレッドからメインスレッドのコードを実行したい場合に便利です。それは次のように通常使用されている

:あなたはそれをドキュメントに記述されている

new Handler(Looper.getMainLooper()).post(task); 

Looper.myLooper()がルーパー現在のスレッドに

+0

これは理にかなっています。ありがとうございました。 getMainLooperは別のスレッドから使​​用されるので、メインスレッドのルーパへの参照を取得できます。理にかなっている。私は実際にどのように役立つかわかりません。アンドロイドのメインスレッドのルーパーは、すでに準備されています。非常に奇妙な便利API。 – j2emanue

+1

私はそれを使用しています...セカンダリスレッドで実行されるサービスを構築しているとしますが、アクティビティにコールバックを渡すときに、アクティビティがおそらくUI更新を行いたいので、それがメインになるようにします。そのシナリオでは、このmainlooper()は役に立ちます.. –

1

が、彼らは同じオブジェクトであります!答えは、ActivityThread.javaLooper.javaThreadLocal.javaのソースコードで見つけることができます。

関連する問題