【问题标题】:StrictModeBuilder permitAll not workingStrictModeBuilder permitAll 不起作用
【发布时间】:2012-07-23 07:35:25
【问题描述】:

我确实有一个旧应用程序拒绝在 Android 4.1 设备上运行。跳到这里的是 NetworkOnMainThreadException。

所以我尝试通过以下步骤来允许这一点 - 但这些都行不通。我用 4.1 模拟器测试过。解决该错误真正需要的是-应用程序重写是没有选择的。目前我从我的应用中排除了 4.1 设备。

一个类文件...

public class StrictModeWrapper {

    static {
        try {
            Class.forName("android.os.StrictMode");
        } catch (Exception exception) {
            throw new RuntimeException(exception);
        }
    }

    public static void checkAvailable() {
    }

    @SuppressLint("NewApi")
    public static void setThreadPolicy() {
        StrictMode.ThreadPolicy strictModeThreadPolicy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(strictModeThreadPolicy);
    }
}

...在扩展的应用程序类中调用:

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        try {
            StrictModeWrapper.checkAvailable();
            StrictModeWrapper.setThreadPolicy();
            } catch (Throwable throwable) {
        }
    }
}

扩展的应用程序类已在清单中注册并正在工作。

【问题讨论】:

  • 几岁?您必须在主线程上进行一些网络操作。StrictMode 自 API-9 以来支持,NetworkOnMainThreadException 在 API-11 中引入

标签: android android-strictmode


【解决方案1】:

自 api 11 以来,StrictMode 似乎没有任何变化。一定是您使用的其他一些 android 类中的变化导致了 StrictMode 政策违规。

Android 文档本身说

“但不要觉得有必要修复 StrictMode 找到的所有内容。”

但由于它是NetworkOnMainThreadException,因此您必须进行彻底检查。查看您应用中的所有网络通信,并确保它们没有阻塞您的主线程。

并确保在发布版本中删除/禁用 StrictMode 代码,因为它只是用于识别意外错误的开发人员工具。

更新:

您的应用崩溃了,因为:

  • 您没有在发布版本中阻止执行 StrictMode 策略设置代码。它应该只在测试时执行。
  • StrictMode 类中的某些更改导致在 onCreate 之后重置严格模式策略。

我有两个问题:

  1. 崩溃是否表明 StrictMode 策略正在运行?存在违反政策的行为,因此崩溃了。
  2. 这是否表明您的应用中有一些网络代码阻塞了主线程?

【讨论】:

  • 这绝对不是真的。今天我发现了 4.1.x (35298) 的问题。由于 JB StrictMode,在 MyApplication.onCreate() 中设置的设置在 onCreate 完成后被重置。这适用于 JB 之前的 Android 版本。该应用程序是一个纯 WLAN 工具 - 根本无法连接 GPRS。我不会改变那个应用程序。我会将它从商店中删除。还是谢谢。
  • StrictMode 代码不应出现在您上传到商店的发布版本中。它只是一个在检测到阻塞主线程的代码时发出警告的工具。在上传到市场之前,它应该被完全阻止或删除..
【解决方案2】:

StrictMode 在 Android 版本 >= 16 上的行为与之前的版本不同。文档建议在扩展应用程序、活动等的 onCreate() 中发出 StrictMode 调用。至少扩展应用程序中的 onCreate() 工作方式不同,并证明文档错误(截至今天)。

这里的 StrictMode 文档描述了如何将 StrictMode 调用添加到扩展应用程序(例如,今天是错误的):

StrictMode

这是一个描述问题并提供解决方法的 Google 代码问题:

Google Code Issue 35298

【讨论】:

    猜你喜欢
    • 2016-02-16
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 2020-10-02
    相关资源
    最近更新 更多