Как лучше всего получить Looper?

Я пробовал mContext.getMainLooper() и Looper.getMainLooper(). И оба возвращают один и тот же результат, но я хотел бы знать, как правильно?

Я также прочитал это по ссылке для разработчиков Android это и это:

Для Looper.getMainLooper():

Looper getMainLooper () Возвращает основной цикл приложения, который находится в основном потоке приложения.

Для mContext.getMainLooper():

Looper getMainLooper () Возвращает Looper для основного потока текущего процесса. Это поток, используемый для отправки вызовов компонентам приложения (действиям, службам и т. д.). По определению этот метод возвращает тот же результат, что и при вызове Looper.getMainLooper().


person Meet Vora    schedule 21.09.2016    source источник
comment
для меня это будет Looper.getMainLooper(), потому что он не требует объекта контекста. И по определению оба похожи, тогда выбор за вами.   -  person Pankaj Kumar    schedule 21.09.2016


Ответы (1)


getMainLooper() В качестве метода он вернет тот же результат в отношении того, как вы его вызвали, поэтому вы можете считать, что они одинаковы, поскольку возврат 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();

}

и при просмотре метода get() в ThreadLocal.class:

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() подготавливает цикл в основном потоке пользовательского интерфейса. Приложения Android обычно не вызывают эту функцию. Поскольку основной поток подготовил свой цикл задолго до запуска первой активности, службы, провайдера или широковещательного приемника.

Но Looper.prepare() подготавливает Looper в текущем потоке. После вызова этой функции поток может вызвать Looper.loop(), чтобы начать обработку сообщений с помощью обработчиков.

А также вы должны знать разницу между 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.
person Muhammed Refaat    schedule 21.09.2016