2016-09-21 6 views
1

Ich habe versucht mContext.getMainLooper() und Looper.getMainLooper(). Und beide bringen das gleiche Ergebnis zurück, aber ich würde gerne wissen, welcher sollte der richtige Weg sein?Was ist die beste Vorgehensweise, Looper zu bekommen?

ich diese auch lesen von einem Android-Entwickler Link this und this:

Für Looper.getMainLooper():

Looper getMainLooper() den Hauptgreifer Anwendung, die Leben in der Hauptthread der Anwendung.

Für mContext.getMainLooper():

Looper getMainLooper() Gibt den Looper für das Hauptgewinde des aktuellen Prozesses. Dies ist der Thread, der zum Senden von Aufrufen an Anwendungskomponenten (Aktivitäten, Dienste usw.) verwendet wird. Per Definition gibt diese Methode das gleiche Ergebnis zurück, das durch Aufruf von Looper.getMainLooper() erhalten würde.

+1

für mich wäre es 'Looper .getMainLooper() ', weil kein Kontextobjekt benötigt wird. Und per Definition sind beide ähnlich, dann ist die Wahl deine. –

Antwort

1

getMainLooper() Als ein Verfahren, wird es das gleiche Ergebnis in Bezug auf die Art und Weise kehren Sie es genannt wird, so kann man die beiden sind die gleichen betrachten, wie aus dem Kontext des Loopers Rückkehr werden Sie das gleiche Ergebnis bei der Rückkehr der Looper aus der Anwendung, und es besseren Blick auf die Looper Klasse zu erhalten und sehen, wie es den Greifer zurück:

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(); 

} 
:

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(); 

} 

und wenn an der get() Methode in ThreadLocal.class suchen

und Thread.currentThread(); nach Thread.class docs:

Returns: die aktuell Thread ausführt.

welches ist der Thread, der den Kontext im Fall von laufenden Android hält.


Und schließlich sehe ich das, was sollten Sie, dass nicht, wie stört, sind den Hauptgreifer zu bekommen, aber was ist die beste Praxis Sie folgen sollen, wenn sie mit Greifern zu tun, wie wenn getMainLooper() und zu verwenden, wenn verwenden Looper.prepare(), as described here:

Looper.prepareMainLooper() bereitet Looper in Haupt-UI-Thread. Android Anwendungen rufen normalerweise diese Funktion nicht auf. Als Haupt-Thread hat seinen Looper lange vor der ersten Aktivität, Dienst, Provider oder Broadcast-Empfänger vorbereitet.

Aber Looper.prepare() bereitet Looper im aktuellen Thread vor. Nachdem diese Funktion aufgerufen wurde, kann Thread Looper.loop() aufrufen, um die Verarbeitung von Nachrichten mit Handlern zu starten.

Und auch Sie sollten den Unterschied zwischen getMainLooper() und myLooper() wissen, as described here:

getMainLooper

Returns the application's main looper, which lives in the main thread of the application. 

myLooper

Return the Looper object associated with the current thread. Returns null if the calling thread is not associated with a Looper. 
Verwandte Themen