获得Looper的最佳做法是什么?

时间:2016-09-21 10:16:37

标签: android android-context android-looper

我尝试了mContext.getMainLooper()Looper.getMainLooper()。 两者都返回相同的结果,但我想知道哪个应该是正确的方式?

我还从Android开发人员链接thisthis

中读取此内容
  

对于Looper.getMainLooper():

     

Looper getMainLooper()返回应用程序的主循环器,它   生活在应用程序的主线程中。

     

对于mContext.getMainLooper():

     

Looper getMainLooper()返回Looper的主线程   目前的过程。这是用于调用调用的线程   应用程序组件(活动,服务等)。根据定义,   此方法返回与调用获得的结果相同的结果   Looper.getMainLooper()。

1 个答案:

答案 0 :(得分:1)

getMainLooper()作为一种方法,它将返回与您调用它的方式相同的结果,因此您可以认为两者是相同的,因为从上下文返回Looper将在返回时获得相同的结果来自应用程序的looper,为了更好地查看Looper类,看看它如何返回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.class中的get()方法:

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

}
根据{{​​3}}文档

Thread.currentThread();

  

返回:       当前正在执行的线程。

这是在运行android时保存上下文的线程。

毕竟,我知道应该困扰你的是不是如何获得主要的活套,但在处理弯曲时应该遵循的最佳做法是什么,比如何时使用getMainLooper()以及何时使用Looper.prepare()Thread.class

  

Looper.prepareMainLooper()在主UI线程中准备looper。 Android的   应用程序通常不会调用此函数。作为主线程   它的looper在第一次活动,服务,提供商或之前很久就做好了准备   广播接收器已启动。

     

但是Looper.prepare()在当前线程中准备Looper。在这之后   函数被调用,线程可以调用Looper.loop()来开始处理   带处理程序的消息。

此外,您应该了解getMainLooper()myLooper()之间的区别,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.