2

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

我还从一个 Android 开发者链接中读到了这个这个

对于 Looper.getMainLooper():

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

对于 mContext.getMainLooper():

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

4

1 回答 1

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.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.currentThread();根据Thread.class文档:

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

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


毕竟,我发现困扰您的不是如何获得主循环器,而是在处理循环器时应该遵循的最佳实践是什么,例如何时使用getMainLooper()和何时使用Looper.prepare()如下所述

Looper.prepareMainLooper() 在主 UI 线程中准备 looper。Android 应用程序通常不调用此函数。由于主线程在第一个活动、服务、提供者或广播接收器启动之前很久就准备好了它的循环器。

但是 Looper.prepare() 在当前线程中准备 Looper。调用此函数后,线程可以调用 Looper.loop() 开始使用 Handlers 处理消息。

而且您还应该知道 和之间的区别getMainLooper()如下所述myLooper()

获取MainLooper

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.
于 2016-09-21T11:34:16.363 回答