4

我确实有一个旧应用程序拒绝在 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) {
        }
    }
}

扩展的 Application 类在 Manifest 中注册并且正在工作。

4

2 回答 2

2

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

Android文档本身说

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

但既然它是一个NetworkOnMainThreadException你必须做一个彻底的检查。查看您的应用程序中的所有网络通信,并确保它们没有阻塞您的主线程。

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

更新:

您的应用程序崩溃了,因为:

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

我有 2 个问题:

  1. 崩溃是否表明 StrictMode 策略正在运行?存在违反政策的行为,因此崩溃了。
  2. 这是否表明您的应用程序中有一些网络代码阻塞了主线程?
于 2012-07-25T17:54:28.157 回答
2

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

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

严格模式

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

谷歌代码问题 35298

于 2012-07-26T09:35:49.780 回答