安卓2.2中的严格模式

3

我将目标SDK设置为3.2,最低SDK设置为2.2,如何在我的应用程序中使用StrictMode呢?我知道它已经被引入了,但我不太清楚如何开始使用它。

6个回答

19

StrictMode.ThreadPolicy自API Level 9引入,而默认的线程策略自API Level 11开始发生了改变。简而言之,不允许在UI线程上执行网络操作(例如:HttpClientHttpUrlConnection)。如果这样做,会出现NetworkOnMainThreadException异常。

您可以通过两种方式轻松解决此错误:

  1. 推荐的解决方法是使用anAsyncTask,以便网络请求不会阻塞UI线程。

  2. 或者,您可以通过将以下代码添加到主活动的onCreate()方法中来覆盖此线程策略。

if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = 
    new StrictMode.ThreadPolicy.Builder().permitAll().build();      
        StrictMode.setThreadPolicy(policy);
 }

希望这对你有所帮助。


圣诞快乐!终于学习了严格模式,解决了那些错误!是时候学习异步编程了! :) - Starwave

8

我的建议有两个方面:

首先,在你的 应用程序onCreate() 中添加一些基线 StrictMode 代码。这样可以轻松地将 StrictMode 应用于整个应用程序(尽管您可以将此代码放在任何位置以进行更具体的测试)。在 StrictMode 文档中有很好的示例代码。

其次,在尝试使用 StrictMode 之前检测 SDK 的版本。这样,您只能在 API 版本 9 或更高版本中使用 StrictMode - 如果您不进行此检查,则会在旧版 Android 上崩溃应用程序。您可以通过查看 Build.VERSION.SDK_INT 来轻松检测 SDK 版本。

可选地,您可能希望仅在测试时启用 StrictMode。如何实现取决于您,但 我过去曾经写过一种解决方案


我不知道为什么,但是在Application.onCreate()此答案的解决方案#2没有起作用(出现了NetworkOnMainThreadException),尽管我的日志代码被打印出来表明方法已被调用。但如果我将其放在我的主活动的onCreate()中,则可以正常工作。 - Rock Lee

2
将 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,则将激活此代码。

应该是 detectAll 吧?很抱歉,官方的 Android 文档像往常一样有点模糊。 - Radu

1

请使用此链接:http://code.tutsplus.com/tutorials/android-sdk_strictmode--mobile-7581,它将对您有所帮助。 - It's Me SMA

0

通过检查API级别并执行严格模式,它有助于解决问题。


0
请参考以下链接了解如何使用它。 将其设置在相关组件或应用程序的onCreate中。

严格模式


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接