getMainLooper()
メソッドとして、呼び出した方法に関して同じ結果を返すため、コンテキストからルーパーを返すと、アプリケーションからルーパーを返すときに同じ結果が得られるため、2 つが同じであると見なすことができます。Looperクラスをよく見て、ルーパーがどのように返されるかを確認してください。
private static Looper sMainLooper;
public static Looper getMainLooper() {
synchronized (Looper.class) {
return sMainLooper;
}
}
public static void prepareMainLooper() {
prepare(false);
synchronized (Looper.class) {
if (sMainLooper != null) {
throw new IllegalStateException(
"The main Looper has already been prepared.");
}
sMainLooper = myLooper();
}
}
public static Looper myLooper() {
return sThreadLocal.get();
}
ThreadLocal.classget()
のメソッドを見ると、次のようになります。
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T) e.value;
}
return setInitialValue();
}
そしてThread.class docsThread.currentThread();
によると:
戻り値: 現在実行中のスレッド。
これは、Android を実行している場合にコンテキストを保持するスレッドです。
結局のところ、ここで説明されているように、メインのルーパーを取得する方法ではなく、いつ使用するか、getMainLooper()
いつ使用するかなど、ルーパーを扱うときに従うべきベストプラクティスは何ですか?Looper.prepare()
Looper.prepareMainLooper() は、メイン UI スレッドでルーパーを準備します。通常、Android アプリケーションはこの関数を呼び出しません。メイン スレッドは、最初のアクティビティ、サービス、プロバイダー、またはブロードキャスト レシーバーが開始されるずっと前にルーパーを準備します。
しかし、 Looper.prepare() は現在のスレッドで Looper を準備します。この関数が呼び出された後、スレッドは Looper.loop() を呼び出して、ハンドラーでメッセージの処理を開始できます。
また、ここで説明されているように、getMainLooper()
との違いも知っておく必要があります。myLooper()
getMainLooper
Returns the application's main looper, which lives in the main thread of the application.
マイルーパー
Return the Looper object associated with the current thread. Returns null if the calling thread is not associated with a Looper.