Most visited

Recently visited

Added in API level 9

StrictMode

public final class StrictMode
extends Object

java.lang.Object
   ↳ android.os.StrictMode


StrictMode是一款开发人员工具,它可以检测出您可能意外执行的操作,并将它们引起您的注意,以便您修复它们。

StrictMode最常用于捕获应用程序主线程上的意外磁盘或网络访问,其中接收UI操作并发生动画。 保持主线程不受磁盘和网络操作影响,可以提供更平滑,更响应的应用程序。 通过保持应用程序的主线程响应,您还可以防止向用户显示ANR dialogs

请注意,尽管Android设备的磁盘通常位于闪存上,但许多设备在内存之上运行文件系统,并发性非常有限。 通常情况下,几乎所有的磁盘访问速度都很快,但在某些情况下,在某些I / O发生在其他进程的背景中时,速度可能会明显变慢。 如果可能的话,最好假定这种事情不是很快。

示例代码从早期使在 ApplicationActivity ,或其它应用程序组件的 onCreate()方法:

 public void onCreate() {
     if (DEVELOPER_MODE) {
         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                 .detectDiskReads()
                 .detectDiskWrites()
                 .detectNetwork()   // or .detectAll() for all detectable problems
                 .penaltyLog()
                 .build());
         StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                 .detectLeakedSqlLiteObjects()
                 .detectLeakedClosableObjects()
                 .penaltyLog()
                 .penaltyDeath()
                 .build());
     }
     super.onCreate();
 }
 

您可以决定检测到违规行为时应该发生的情况。 例如,使用penaltyLog() ,你可以看的输出adb logcat ,而你用你的应用程序,查看违法行为,因为它们发生。

如果你发现你的感觉有问题的违规行为,有各种各样的工具来帮助解决这些问题:线程, HandlerAsyncTaskIntentService等,但不觉得有必要修复StrictMode耳目一新。 特别是,在正常的活动生命周期中,通常需要磁盘访问的许多情况。 使用StrictMode查找你意外做的事情。 但是,UI线程上的网络请求几乎总是一个问题。

StrictMode不是一种安全机制,并不保证能够找到所有磁盘或网络访问。 虽然它在进行Binder调用时跨越进程边界传播其状态,但它最终仍然是尽力而为的机制。 值得注意的是,来自JNI调用的磁盘或网络访问不一定会触发它。 未来的Android版本可能会捕获更多(或更少)的操作,因此您绝对不应该在Google Play上分发的应用程序中启用StrictMode。

Summary

Nested classes

class StrictMode.ThreadPolicy

应用于某个线程的StrictMode策略。

class StrictMode.VmPolicy

应用于虚拟机进程中所有线程的StrictMode策略。

Public methods

static StrictMode.ThreadPolicy allowThreadDiskReads()

一个方便的包装,从 getThreadPolicy()采取当前 StrictMode.ThreadPolicy ,将其修改为允许读取磁盘,并将新策略设置为 setThreadPolicy(StrictMode.ThreadPolicy) ,返回旧策略,以便可以在块末尾恢复它。

static StrictMode.ThreadPolicy allowThreadDiskWrites()

一个便捷的包装程序,从 getThreadPolicy()获取当前 StrictMode.ThreadPolicy ,将其修改为允许磁盘读写,并将新策略设置为 setThreadPolicy(StrictMode.ThreadPolicy) ,返回旧策略,以便可以在块末尾恢复该策略。

static void enableDefaults()

启用推荐的StrictMode默认值,只记录违规情况。

static StrictMode.ThreadPolicy getThreadPolicy()

返回当前线程的策略。

static StrictMode.VmPolicy getVmPolicy()

获取当前的VM策略。

static void noteSlowCall(String name)

代码要注意的是它很慢。

static void setThreadPolicy(StrictMode.ThreadPolicy policy)

设置应检测当前线程上的哪些操作的策略,以及发生此类操作时的处罚。

static void setVmPolicy(StrictMode.VmPolicy policy)

设置应检测VM进程(在任何线程上)的操作的策略,以及发生此类操作时的处罚。

Inherited methods

From class java.lang.Object

Public methods

allowThreadDiskReads

Added in API level 9
StrictMode.ThreadPolicy allowThreadDiskReads ()

一个便捷的包装,从 getThreadPolicy()采取当前 StrictMode.ThreadPolicy ,修改它以允许磁盘读取,并将新策略设置为 setThreadPolicy(StrictMode.ThreadPolicy) ,返回旧策略,以便可以在块的末尾恢复它。

Returns
StrictMode.ThreadPolicy the old policy, to be passed to setThreadPolicy to restore the policy.

allowThreadDiskWrites

Added in API level 9
StrictMode.ThreadPolicy allowThreadDiskWrites ()

一个便捷的包装程序,从 getThreadPolicy()中获取当前 StrictMode.ThreadPolicy ,将其修改为允许磁盘读写,并将新策略设置为 setThreadPolicy(StrictMode.ThreadPolicy) ,并返回旧策略,以便可以在块末尾将其恢复。

Returns
StrictMode.ThreadPolicy the old policy, to be passed to setThreadPolicy(StrictMode.ThreadPolicy) to restore the policy at the end of a block

enableDefaults

Added in API level 9
void enableDefaults ()

启用推荐的StrictMode默认值,只记录违规情况。

这会捕获主线程上的磁盘和网络访问,以及泄漏的SQLite游标和未关闭的资源。 这只是setVmPolicy(StrictMode.VmPolicy)setThreadPolicy(StrictMode.ThreadPolicy)的包装。

getThreadPolicy

Added in API level 9
StrictMode.ThreadPolicy getThreadPolicy ()

返回当前线程的策略。

Returns
StrictMode.ThreadPolicy

getVmPolicy

Added in API level 9
StrictMode.VmPolicy getVmPolicy ()

获取当前的VM策略。

Returns
StrictMode.VmPolicy

noteSlowCall

Added in API level 11
void noteSlowCall (String name)

代码要注意的是它很慢。 这是一个无操作,除非当前线程的StrictMode.ThreadPolicy已经detectCustomSlowCalls()启用。

Parameters
name String: a short string for the exception stack trace that's built if when this fires.

setThreadPolicy

Added in API level 9
void setThreadPolicy (StrictMode.ThreadPolicy policy)

设置应检测当前线程上的哪些操作的策略,以及发生此类操作时的处罚。

在内部,它设置了一个在跨进程IPC调用中传播的线程局部变量,这意味着当系统服务或其他进程代表您访问磁盘或网络时,您可以捕获违规。

Parameters
policy StrictMode.ThreadPolicy: the policy to put into place

setVmPolicy

Added in API level 9
void setVmPolicy (StrictMode.VmPolicy policy)

设置应检测VM进程(在任何线程上)的操作的策略,以及发生此类操作时的处罚。

Parameters
policy StrictMode.VmPolicy: the policy to put into place

Hooray!