我正在使用OkHttp (首先是最初的版本,然后升级到OkHttp3),我的应用程序的一些用户在应用程序没有运行时报告了严重的电池寿命损失。
我运行了一个分析器,结果是:

如您所见,Okio看门狗一直在运行。在大约一半的时间里,我的应用程序完全处于后台。此时没有HTTP任务发生。在上次HTTP任务结束后,我开始进行分析。
看门狗这样跑来跑去是正常的吗?如果是这样的话,我是否正确地假设这个线程造成了大量的电池浪费?如果这是不正常的,像泄密的上下文会让看门狗继续运行吗?
看门狗代码在这里运行,它似乎没有终止条件而运行:
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) {
}
}
}
}发布于 2016-01-26 14:05:36
看起来像是Okio中一个严重且意外的bug。我会试着复制和修复。如果你能够持续地产生这个错误,请评论这个错误!
发布于 2016-04-01 14:33:36
对我来说,这是由保安的优化造成的。经过一些调查-见上文链接的okio问题-一个解决办法(如果不是最终解决办法呢?)是禁用优化或将其添加到您的Pro卫士规则中。add:
-optimizations !method/marking/static,!method/removal/parameter,!code/removal/advanced发布于 2016-05-20 05:50:22
我在这个手册里找到一张便条
注释:配置指定类‘.’的任何一个方法有任何副作用, 您的配置包含一个选项-assumenosideeffects,用于指示指定的方法没有任何副作用。但是,通过使用"*;“这样的通配符,配置试图匹配所有方法。这包括来自java.lang.Object的方法,例如等待()和通知()。删除这些方法的调用很可能会破坏您的应用程序。您应该更保守地列出没有副作用的方法。您可以通过指定-dontnote选项来关闭这些注释。
您应该在-assumenosideeffects块中指定方法名。
我在https://github.com/square/okio/issues/185#issuecomment-220520926上添加了这个评论
https://stackoverflow.com/questions/34997596
复制相似问题