Асинхронный Pubnub вызывает блок Android-поток пользовательского интерфейса

Я пытаюсь получить время сервера от pubnub с помощью метода time

mPubnub.time(callback);

Я полагаю, что это асинхронный вызов, тогда у меня есть цикл ожидания сразу после того, как я могу ждать результата

time = -1;
mPubnub.time(callback);
while(time == -1);

В обратном звонке у меня есть

Callback callback = new Callback() {
    public void successCallback(String channel, Object response) {
        try {
            JSONArray jsonArray = new JSONArray(response.toString());
            time = jsonArray.getLong(0) / 10000;
            return;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        time = 0;
    }

    public void errorCallback(String channel, PubnubError error) {
        Log.wtf("error/" + channel, error.toString());
        time = 0;
    }
};

Все эти звонки из doInBackground из AsyncTask, Почему это блокирует мой поток пользовательского интерфейса. Также вызовы публикации также блокируют мой поток пользовательского интерфейса, и я вызываю их только из AsyncTask

Многие говорят, что цикл while блокирует поток пользовательского интерфейса, но я не понимаю, почему этот цикл в AsyncTask блокирует поток пользовательского интерфейса. Это не было в onPostExecute или же onProgressExecute, Это было в doInBackground и это не должно блокировать пользовательский интерфейс.

С другой стороны, удаление цикла по-прежнему блокирует поток пользовательского интерфейса.

mPubnub.time(callback);
mPubnub.publish(channel, message, true, callback);

эти простые вызовы блокируют поток пользовательского интерфейса, и приложение перестает отвечать на запросы.

2 ответа

Это блокирует ваш поток пользовательского интерфейса:

while(time == -1);

Вместо этого вы должны обработать успех / неудачу с помощью обратного вызова. Если API pubnub принимает такой обратный вызов, это выглядит так, как будто он уже обрабатывает это в фоновом потоке. Просто выполните соответствующее действие внутри обработчиков обратного вызова.

while(время == -1);

Эта строка блокирует ваш поток пользовательского интерфейса, поскольку этот указатель никогда не будет обновлен другим потоком, это не переменная переменная. Вы можете использовать Debug Bottle для обнаружения кодов блоков пользовательского интерфейса в вашем проекте.

Другие вопросы по тегам