6

我参考StrictMode.ThreadPolicy.Builder了 android 文档StrictMode.ThreadPolicy.Builder

我对StrictMode.ThreadPolicy.Builder.
当我们不得不使用这个类时StrictMode.ThreadPolicy.Builder
有什么好处和目的StrictMode.ThreadPolicy.Builder
我想要详细的解释

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
 .detectAll()
 .penaltyLog()
 .build();
StrictMode.setThreadPolicy(policy);
4

1 回答 1

8

在您的应用程序中定义 stictmode 策略的优点是迫使您在开发阶段使您的应用程序在运行它的设备中表现得更好:避免在 UI 线程上运行 IO 操作,避免 Activity 泄漏等。当您在代码中定义这些策略时,如果定义的严格策略受到破坏,您的应用程序就会崩溃,这使您可以修复您已经完成的问题(行为不佳的方法,例如 UI 线程上的网络操作)。

当我开始一个新项目时,我喜欢首先做以下事情:

public class MyApplication extends Application {

private static final String TAG = "MyApplication";

@Override
public void onCreate() {
    if (BuildConfig.DEBUG) {
        Log.w(TAG, "======================================================");
        Log.w(TAG, "======= APPLICATION IN STRICT MODE - DEBUGGING =======");
        Log.w(TAG, "======================================================");

        /**
         * Doesn't enable anything on the main thread that related
         * to resource access.
         */
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectAll()
                .penaltyLog()
                .penaltyFlashScreen()
                .penaltyDeath()
                .build());

        /**
         * Doesn't enable any leakage of the application's components.
         */
        final StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            builder.detectLeakedRegistrationObjects();
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
            builder.detectFileUriExposure();
        }
        builder.detectLeakedClosableObjects()
               .detectLeakedSqlLiteObjects()
               .penaltyLog()
               .penaltyDeath();
        StrictMode.setVmPolicy(builder.build());
    }
    super.onCreate();
}

}

并在应用程序标签下设置 AndroidManifest.xml 如下:

android:debuggable="true"

下面我向您展示了仅当我的应用程序处于调试模式时才对我的应用程序强制使用 Strictmode 策略(必须在发布之前删除清单中的标志)。

希望能帮助到你。

于 2013-08-07T10:04:12.807 回答