Кодовое имя One AnalyticsService внезапно полностью блокирует поток приложений

#google-analytics #codenameone

#google-analytics #codenameone

Вопрос:

В моем приложении с кодовым именем one вся маршрутизация выполняется в методе, который выглядит следующим образом:

     if (AnalyticsService.isEnabled()) {
        AnalyticsService.visit(route.toString(), route.getPrevious());
    }

    switch (route) {
        case Home:
            HomeFormManager.getInstance().showForm();
            break;
        case Loading:
            LoadingFormManager.getInstance().showForm();
            break;
        case Error:
            ErrorFormManager.getInstance().showForm();
            break;
        // some other forms here
        default:
            break;
    }
 

Идея очевидна, каждый раз, когда мы переходим к новой форме, мы регистрируем ее в аналитике. Этот код работал безупречно до сегодняшнего дня. Теперь, внезапно, строка, в которой мы вызываем visit метод, полностью блокирует поток приложения, если мы переходим к форме ошибки. После некоторой отладки я обнаружил, что приложение застревает в AnalyticsService.GetGARequest, и особенно в Log.getUniqueDeviceId, где запрос идентификатора устройства отправляется на серверы сборки codename one, а затем вечно ожидает ответа. Этого не происходит для других форм, поскольку только для формы ошибки я вызываю Preferences.ClearAll() и, следовательно, для других форм Log.getUniqueDeviceId возвращает идентификатор непосредственно из настроек. Однако я должен вызвать Preferences.ClearAll() из-за логики в моем приложении. Есть идеи, как обойти это и какие недавние изменения вызвали это?

Комментарии:

1. Странно, что это заблокировало бы, поскольку серверы должны быть запущены. Вы видите это в симуляторе? Если да, можете ли вы открыть сетевой монитор и посмотреть значения неудачного запроса / ответа?

2. Я только что попробовал HTTP-запрос, он не отображается на сетевом мониторе. Используя отладчик, я вижу, что он зависает в NetworkManager addToQueueAndWait, а внутри него в методе run класса waiting поле finishedWaiting навсегда остается false, так что, может быть, это что-то связанное с EDT, а не с серверами?

3. Возможно ли, что предыдущий запрос каким-то образом застрял там или произошел сбой таким образом, что сетевой менеджер попал в цикл?

4. По крайней мере, я этого не вижу. Я попытаюсь найти небольшой пример, который воспроизводит это, и если я не смогу, это должно быть какой-то проблемой с моей стороны.

5. @ShaiAlmog, я не могу воспроизвести это на реальном устройстве. Интересно, что я также использую библиотеку CN1 для подключения, и она зависает в одном очень специфическом случае (отличном от этого), когда вызывается Connectivity.isConnected() , но также это невозможно воспроизвести на устройстве, поэтому может быть что-то незначительное в симуляторе.