2

我正在android中开发基于网络的项目,因此,为了防止强制关闭Android ICS Can't do network operation on UI Thread,我必须使用下面的代码部分或尝试在其他线程上启动我的网络操作,但我不想改变基本代码,所以我应该在 Android ICS 上使用如下代码。:

static {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
            .permitAll().build();
    StrictMode.setThreadPolicy(policy);
}

如何制作唯一的 apk 文件以在所有 android 版本(> = 1.6)中运行?android.os.StrictMode可用于更高版本的 android,因此,我无法尝试在我的 Android Activity 中使用上述代码部分。那么,哪种解决方案更好:

  1. 使用反射在更高版本的 API 上运行这部分代码 ( As oracle docs, reflective operations have slower performance than their non-reflective counterparts)
  2. 将我的 android 构建目标更改为 Android 4.1.1 (API 16) 并尝试更改android:minSdkVersionAndroidManifest.xml

或者如果你知道更好的,请告诉我。

提前致谢 :)

4

1 回答 1

1

您可以使用 BUILD.VERSION 和反射来克服这个兼容性问题(经过测试)。

    if (Integer.valueOf(android.os.Build.VERSION.SDK_INT) >= 9) {
        try {
            // StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.LAX);
            Class<?> strictModeClass = Class.forName("android.os.StrictMode", true, Thread.currentThread()
                    .getContextClassLoader());
            Class<?> threadPolicyClass = Class.forName("android.os.StrictMode$ThreadPolicy", true, Thread.currentThread()
                    .getContextClassLoader());
            Field laxField = threadPolicyClass.getField("LAX");
            Method setThreadPolicyMethod = strictModeClass.getMethod("setThreadPolicy", threadPolicyClass);
            setThreadPolicyMethod.invoke(strictModeClass, laxField.get(null));
        } catch (Exception e) {
        }
    }
于 2012-08-31T11:52:19.833 回答