Как мне получить Looper для новой темы, которую я только что создал? - PullRequest
0 голосов
/ 10 января 2020

Я создаю поток для обработки запроса. В потоке я должен вызвать Looper.prepare(), который требуется для некоторых других функций, которые он использует, а затем я вызываю Looper.loop(). Но когда соединение для запроса закрыто, я получаю обратный вызов в другом потоке. В этот момент мне нужно вызвать quit() на лупере потока, чтобы l oop () возвратился и поток завершился. Тем не менее, мне трудно понять, как получить петлю потока. Я не вижу ничего в Thread, чтобы получить Looper для потока. В классе Looper я вижу способ получить петлитель для текущего класса, но я не могу передать эту информацию из внутреннего класса Thread в класс, который ее создает:

                final Looper l1;
                final Thread thread = new Thread() {
                    @Override
                    public void run() {
                        Looper.prepare();
                        l1 = Looper.myLooper(); // ERROR!
                        // initialization goes here
                        Looper.loop();
                        Log.d(logtag,"The request thread is done.");
                    }
                };
                thread.start();

и в обратном вызове, который следует сразу за вышеуказанной строкой:

webSocket.setClosedCallback(new CompletedCallback() {
    @Override
    public void onCompleted(Exception ex) {
        // other code
        l1.quit();
    }
});

Я получаю ошибку времени компиляции в строке, отмеченной выше:

Cannot assign a value to final variable 'l1'.

Но я не назначил ее еще! Если я не сделаю Looper финальным, я не смогу назначить его, потому что он не финальный.

1 Ответ

0 голосов
/ 10 января 2020

Это похоже на хак, но я создал этот класс (приватный, в том же файле):

class LooperHolder {
    Looper l1 = null;
    void setLooper(Looper looper) {
        l1 = looper;
    }
    Looper getLooper() {
        return l1;
    }
}

Затем я изменил свой код на go через держатель петлителя:

            final LooperHolder lh = new LooperHolder();
            final Thread thread = new Thread() {
                @Override
                public void run() {
                    Looper.prepare();
                    lh.setLooper(Looper.myLooper());
                    // initialization goes here
                    Looper.loop();
                    Log.d(logtag,"The request thread is done.");
                }
            };
            thread.start();

А затем в обратном вызове:

Looper l1 = lh.getLooper();
if (l1 != null) l1.quit();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...