mHandler не установлен из синхронизированного блока в Android SDK - PullRequest
2 голосов
/ 01 декабря 2010

Просматривая исходный код фреймворка Android SDK, я сталкивался с этим:


private final class GpsLocationProviderThread extends Thread {

        public GpsLocationProviderThread() {
            super("GpsLocationProvider");
        }

        public void run() {
            Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
            initialize();
            Looper.prepare();
            mHandler = new ProviderHandler();
            // signal when we are initialized and ready to go
            mInitializedLatch.countDown();
            Looper.loop();
        }
    }

(это из фреймворков / базы / location / java / com / android / internal / location / GpsLocationProvider в Froyo.java)

GpsLocationProviderThread является внутренним классом GpsLocationProvider, а mHandler является переменной экземпляра члена GpsLocationProvider.Эта переменная устанавливается в методе run() этого потока, но синхронизация не применяется, и mHandler не является volatile.

Почему это работает?И даже если 99% времени это работает, это не всегда гарантирует работу, и это, конечно, не очень хорошая практика.Я прав в этом понимании, или в этом коде есть что-то тонкое, что я неправильно понимаю?

1 Ответ

1 голос
/ 01 декабря 2010

Поток создается при создании провайдера (в его конструкторе), а mInitializedLatch обеспечивает выполнение конструктора только после запуска потока.

После этой точки mHandlerсоздан и допустим, а поскольку методы класса Handler являются реентерабельными, эта система должна быть поточно-ориентированной.В конце концов, Handler - это класс, предназначенный для связи между потоками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...