【发布时间】:2011-11-24 14:36:25
【问题描述】:
我将 target sdk 设置为 3.2 并将 min sdk 设置为 2.2,我如何在我的应用程序中使用 strictmode,据我了解它已被引入,但无法真正了解如何开始使用它。
【问题讨论】:
标签: android android-strictmode
我将 target sdk 设置为 3.2 并将 min sdk 设置为 2.2,我如何在我的应用程序中使用 strictmode,据我了解它已被引入,但无法真正了解如何开始使用它。
【问题讨论】:
标签: android android-strictmode
StrictMode.ThreadPolicy 从 API 级别 9 开始引入,默认线程策略从 API 级别 11 开始更改,简而言之,不允许网络操作
(例如:HttpClient 和 HttpUrlConnection)在 UI 线程上执行。如果你这样做,你会得到 NetworkOnMainThreadException。
您可以通过两种方式轻松解决此错误:-
解决此问题的推荐方法是使用 anAsyncTask 所以
网络请求不会阻塞 UI 线程。
或者,您可以通过添加 将下面的代码添加到您的主要活动的 onCreate() 方法中。
if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); }
希望这对你有帮助..
【讨论】:
我的建议有两个:
首先,将一些基线StrictMode code 添加到您的Application 的onCreate()。这使您可以轻松地将 StrictMode 应用于整个应用程序(尽管您可以将此代码放在任何地方进行更具体的测试)。 StrictMode 文档中有很好的示例代码。
其次,在尝试使用 StrictMode 之前检测 SDK 的版本。这样,您只能在 API 版本 9 或更高版本中使用 StrictMode - 如果您不执行此检查,您将在旧版本的 Android 上崩溃您的应用程序。您可以通过查看Build.VERSION.SDK_INT 轻松检测 SDK 版本。
或者,您可能只想在测试时启用 StrictMode。你如何做到这一点取决于你,虽然I've written up one solution for this in the past。
【讨论】:
Application.onCreate() 中不起作用(得到NetworkOnMainThreadException),尽管我的日志记录代码被打印出来表明这些方法被调用了。但如果我把它放在我的主要活动的onCreate() 中,它确实有效。
将 Android Manifest 设置为类似的内容。
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16" android:maxSdkVersion="16"/>
在 onCreate 方法中使用以下代码。
int SDK_INT = android.os.Build.VERSION.SDK_INT;
if (SDK_INT>8){
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
注意:禁用警告,因为您已经在检查哪个版本的 Android 将使用此代码。
如果Android版本高于Android 2.2,此代码将被激活
【讨论】:
这对于如何在 App 中使用 StrictMode 真的很有帮助? 检查这个.. http://mobile.tutsplus.com/tutorials/android/android-sdk_strictmode/
【讨论】:
请参考以下链接了解如何使用它。 在相关组件或Application的onCreate上设置
【讨论】:
它通过检查 api 级别然后执行严格模式来帮助解决问题。
【讨论】: