Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android CPU使用异常-Okio看门狗_Android_Okhttp_Okhttp3_Okio - Fatal编程技术网

Android CPU使用异常-Okio看门狗

Android CPU使用异常-Okio看门狗,android,okhttp,okhttp3,okio,Android,Okhttp,Okhttp3,Okio,我使用的是OkHttp(首先是最初的verison,然后升级到OkHttp3),我的应用程序的一些用户报告说,当应用程序不运行时,电池寿命会显著下降 我运行了一个探查器,结果如下: 正如你所看到的,Okio看门狗一直在运行。大约在中途,我的应用程序完全处于后台。此时没有发生HTTP任务。我在上一个HTTP任务结束后开始分析 看门狗这样到处跑是正常的吗?如果是这样的话,我认为这个线程造成了大量的电池浪费,对吗?如果这是不正常的,像泄漏的上下文之类的东西能让看门狗继续运行吗 在这里运行,似乎运行时

我使用的是OkHttp(首先是最初的verison,然后升级到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) {
            }
        }
    }
}

看起来像是Okio中一个严重的意外错误。我将尝试复制和修复。如果您能够始终如一地生成此错误,请对此错误进行评论


对我来说,这是由proguard的优化造成的。经过一些调查-参见上面链接的okio问题-解决方法(如果不是最终修复?)是禁用优化或将其添加到proguard-rules.pro中:

-optimizations !method/marking/static,!method/removal/parameter,!code/removal/advanced
我在这本书里找到一张便条

注意:配置指定类“…”的任何方法都没有任何副作用

您的配置包含一个选项-assumenosideeffects,以指示指定的方法没有任何副作用。但是,该配置试图通过使用诸如“*;”之类的通配符来匹配所有方法。这包括java.lang.Object中的方法,如wait()和notify()。删除这些方法的调用很可能会破坏应用程序。你应该更保守地列出没有副作用的方法。您可以通过指定-dontnote选项来关闭这些注释

您应该在-assumenosideeffects块中指定方法名称


老实说,我在

上加了这句话,我还没有调查过。希望是今天。