public final class StrictMode
extends Object
java.lang.Object | |
↳ | android.os.StrictMode |
StrictMode是一款开发人员工具,它可以检测出您可能意外执行的操作,并将它们引起您的注意,以便您修复它们。
StrictMode最常用于捕获应用程序主线程上的意外磁盘或网络访问,其中接收UI操作并发生动画。 保持主线程不受磁盘和网络操作影响,可以提供更平滑,更响应的应用程序。 通过保持应用程序的主线程响应,您还可以防止向用户显示ANR dialogs 。
请注意,尽管Android设备的磁盘通常位于闪存上,但许多设备在内存之上运行文件系统,并发性非常有限。 通常情况下,几乎所有的磁盘访问速度都很快,但在某些情况下,在某些I / O发生在其他进程的背景中时,速度可能会明显变慢。 如果可能的话,最好假定这种事情不是很快。
示例代码从早期使在 Application
, Activity
,或其它应用程序组件的 onCreate()
方法:
public void onCreate() { if (DEVELOPER_MODE) { StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder
() .detectDiskReads() .detectDiskWrites() .detectNetwork() // or .detectAll() for all detectable problems .penaltyLog() .build()); StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder
() .detectLeakedSqlLiteObjects() .detectLeakedClosableObjects() .penaltyLog() .penaltyDeath() .build()); } super.onCreate(); }
您可以决定检测到违规行为时应该发生的情况。 例如,使用penaltyLog()
,你可以看的输出adb logcat
,而你用你的应用程序,查看违法行为,因为它们发生。
如果你发现你的感觉有问题的违规行为,有各种各样的工具来帮助解决这些问题:线程, Handler
, AsyncTask
, IntentService
等,但不觉得有必要修复StrictMode耳目一新。 特别是,在正常的活动生命周期中,通常需要磁盘访问的许多情况。 使用StrictMode查找你意外做的事情。 但是,UI线程上的网络请求几乎总是一个问题。
StrictMode不是一种安全机制,并不保证能够找到所有磁盘或网络访问。 虽然它在进行Binder
调用时跨越进程边界传播其状态,但它最终仍然是尽力而为的机制。 值得注意的是,来自JNI调用的磁盘或网络访问不一定会触发它。 未来的Android版本可能会捕获更多(或更少)的操作,因此您绝对不应该在Google Play上分发的应用程序中启用StrictMode。
Nested classes |
|
---|---|
class |
StrictMode.ThreadPolicy 应用于某个线程的 |
class |
StrictMode.VmPolicy 应用于虚拟机进程中所有线程的 |
Public methods |
|
---|---|
static StrictMode.ThreadPolicy |
allowThreadDiskReads() 一个方便的包装,从 |
static StrictMode.ThreadPolicy |
allowThreadDiskWrites() 一个便捷的包装程序,从 |
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
|
StrictMode.ThreadPolicy allowThreadDiskReads ()
一个便捷的包装,从 getThreadPolicy()
采取当前 StrictMode.ThreadPolicy
,修改它以允许磁盘读取,并将新策略设置为 setThreadPolicy(StrictMode.ThreadPolicy)
,返回旧策略,以便可以在块的末尾恢复它。
Returns | |
---|---|
StrictMode.ThreadPolicy |
the old policy, to be passed to setThreadPolicy to restore the policy. |
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 |
void enableDefaults ()
启用推荐的StrictMode默认值,只记录违规情况。
这会捕获主线程上的磁盘和网络访问,以及泄漏的SQLite游标和未关闭的资源。 这只是setVmPolicy(StrictMode.VmPolicy)
和setThreadPolicy(StrictMode.ThreadPolicy)
的包装。
StrictMode.ThreadPolicy getThreadPolicy ()
返回当前线程的策略。
Returns | |
---|---|
StrictMode.ThreadPolicy |
StrictMode.VmPolicy getVmPolicy ()
获取当前的VM策略。
Returns | |
---|---|
StrictMode.VmPolicy |
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. |
void setThreadPolicy (StrictMode.ThreadPolicy policy)
设置应检测当前线程上的哪些操作的策略,以及发生此类操作时的处罚。
在内部,它设置了一个在跨进程IPC调用中传播的线程局部变量,这意味着当系统服务或其他进程代表您访问磁盘或网络时,您可以捕获违规。
Parameters | |
---|---|
policy |
StrictMode.ThreadPolicy : the policy to put into place |
void setVmPolicy (StrictMode.VmPolicy policy)
设置应检测VM进程(在任何线程上)的操作的策略,以及发生此类操作时的处罚。
Parameters | |
---|---|
policy |
StrictMode.VmPolicy : the policy to put into place |