2016-01-25 4 views
2

Я использую OkHttp (сначала оригинальную версию, затем я обновил до OkHttp3), некоторые пользователи моего приложения сообщают о значительной потери времени работы от батареи, когда приложение не работает.Аномальное использование ЦП - Okio Watchdog

Я побежал профилировщика и это результат:

profiler of App

Как вы можете видеть, Окио Watchdog работает все время. Примерно на полпути мое приложение полностью находится в фоновом режиме. На данный момент HTTP-задачи не выполняются. Я начал профилирование после завершения последней задачи HTTP.

Нормально ли, что сторожевой таймер работает повсюду? Если это так, я прав, полагая, что эта нить вызывает много отработанных батарей? Если это не нормально, может ли что-то вроде утечки Context держать Watchdog?

В Watchdog code работает здесь, похоже, прогоны без условия завершения:

private static final class Watchdog extends Thread { 
    public Watchdog() { 
     super("Okio Watchdog"); 
     setDaemon(true); 
    } 

    public void run() { 
     while (true) { 
      try { 
       AsyncTimeout timedOut = awaitTimeout(); 

       // Didn't find a node to interrupt. Try again. 
       if (timedOut == null) continue; 

       // Close the timed out node. 
       timedOut.timedOut(); 
      } catch (InterruptedException ignored) { 
      } 
     } 
    } 
} 

ответ

4

Похож тяжелой & неожиданной ошибки в Окио. Я попытаюсь воспроизвести исправление &. Если вы в состоянии произвести это последовательно, прокомментируйте эту ошибку!

https://github.com/square/okio/issues/185

+0

Вам удалось воспроизвести это вообще? – Knossos

+0

Я еще не исследовал, если честно. Сегодня, надеюсь. –

2

Для меня это было вызвано оптимизацией Proguard в. (? Если не окончательное исправление) После некоторого исследования - - см Окио вопрос, связанный выше обходной путь, чтобы отключить оптимизацию или добавить это к вашему proguard-rules.pro:

-optimizations !method/marking/static,!method/removal/parameter,!code/removal/advanced 
1

Я нахожу пометку в этом manual

Примечание: конфигурация определяет, что ни один из методов класса «...» не имеют каких-либо побочных эффектов

Ваша конфигурация содержит вариант -assumenosideeffects, чтобы указать, что указанные методы не имеют какой-либо сторона e ffects. Однако конфигурация пытается сопоставить все методы с помощью подстановочного знака типа «*;». Сюда входят методы из java.lang.Object, такие как wait() и notify(). Удаление вызовов этих методов скорее всего нарушит ваше приложение. Вы должны перечислить методы без побочных эффектов более консервативно. Вы можете отключить эти примечания, указав опцию -dontnote.

Необходимо указать имя метода в блоке -assumenosideeffects.

добавить этот комментарий в https://github.com/square/okio/issues/185#issuecomment-220520926