StrictMode是怎样监控主线程I/O的?

setThreadPolicy之后就会调用下面这个函数,分别是“setBlockGuardPolicy”用于保存线程规则到Java代码的。而“Binder.setThreadStrictModePolicy"则是保存线程规则到Binder, 在跨进程调用中也可以触发的Thread Policy并处理。注意的是,研究了半天代码,发现后者基本上就是保存而已,并没有进行是否主线程I/O的判断。

StrictMode是怎样监控主线程I/O的?_第1张图片

那跟着,我们就重点说说Java的setBlockGuardPolicy, 通过设置BlockGuard,线程规则和对应的处理方式通过全局变量threadPolicy保存下来。

StrictMode是怎样监控主线程I/O的?_第2张图片

当需要使用的时候,则调用BlockGuard.getThreadPolicy来获取规则设置

StrictMode是怎样监控主线程I/O的?_第3张图片

使用的时候很简单,例如在BlockGuardOS.java(全部文件接口的实现)去执行BlockGuard.getThradPolicy().onWriteToDisk()来处理这否主线程I/O并执行生成crash或者获取堆栈。

BlockGuardOs.java

StrictMode是怎样监控主线程I/O的?_第4张图片

正如上面所说,下面就是onWriteToDisk真实处理的代码,可以看到它会打印堆栈。

StrictMode是怎样监控主线程I/O的?_第5张图片

除了文件,数据库也进行了主线程I/O的监控, 通过一切数据库操作入口:execute函数执行applyBlockGuardPolicy,达成了同步去监控是否有主线程读写并产生对应处理的效果。

SQLiteConnection.java

StrictMode是怎样监控主线程I/O的?_第6张图片
StrictMode是怎样监控主线程I/O的?_第7张图片

你可能感兴趣的:(StrictMode是怎样监控主线程I/O的?)