http://blog.youkuaiyun.com/t12x3456/article/details/8877679

本文介绍Android 2.3新增的严苛模式(StrictMode),它能帮助开发者检测应用中的不良行为,例如在主线程中进行网络操作或磁盘访问等可能导致应用响应迟缓的行为。通过配置不同的策略,开发者可以选择记录日志、显示警告或直接让应用崩溃。
部署运行你感兴趣的模型镜像
Android 2.3提供一个称为严苛模式(StrictMode)的调试特性,Google称该特性已经使数百个Android上的Google应用程序受益。那它都做什么呢?它将报告与线程及虚拟机相关的策略违例。一旦检测到策略违例(policy violation),你将获得警告,其包含了一个栈trace显示你的应用在何处发生违例。你可以强制用警告代替崩溃(crash),也可以仅将警告计入日志,让你的应用继续执行。策略的细节尚难确定,可以期待随Android的成熟Google将增加更多策略。

    目前有2种策略可用,第一个和线程相关,它主要针对主线程(或UI线程)。由于在主线程中读写磁盘和进行网络访问都不是好的做法,Google已经在磁盘和网络代码中添加了严苛模式(StrictMode)钩子(hook)。如果你对某个线程打开严苛模式(StrictMode),当那个线程进行磁盘和网络访问,你将获得警告。你可以选择警告方式。一些违例包含用户慢速调用(custom slow calls 这么翻译行吗?),磁盘读写,网络访问。你能选择将警告写入LogCat,显示一个对话框,闪下屏幕,写入DropBox日志文件,或让应用崩溃。最通常的做法是写入LogCat或让应用崩溃。


写程序时,你应该始终假定下列两种情况:

网络很慢(你正在试图连接的服务器甚至可能没有响应);

文件系统的访问速度很慢。

结论就是,不应该在主线程内进行网络操作或访问文件系统,因为缓慢的操作会拖累系统的响应能力。虽然在开发环境中,你可能永远不会遇到任何网络问题或任何文件系统的性能问题,但用户可能不像你那么幸运。

注意 SD卡并不都具有相同“速度”,如果应用在很大程度上依赖外部存储设备的性能,那么你应该确保在来自不同制造商的各种SD卡上测试过你的应用。

Android有实用工具来帮助应用检测这类缺陷。它提供的StrictMode是检测不良行为的良好工具。通常情况下,在应用启动时,即当onCreate()被调用时,启用StrictMode,如代码清单1-15所示。

在应用中启用StrictMode

  1. public class MyApplication extends Application {  
  2.     @Override  
  3.     public void onCreate () {  
  4.         super.onCreate();  
  5.   
  6.         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()  
  7.         .detectCustomSlowCalls()// API等级11,使用StrictMode.noteSlowCode  
  8.         .detectDiskReads()  
  9.         .detectDiskWrites()  
  10.         .detectNetwork()  
  11.         .penaltyLog()  
  12.         .penaltyFlashScreen()// API等级11  
  13.         .build());  
  14.   
  15.          // 其实和性能无关,但如果使用StrictMode,最好也定义VM策略  
  16.          StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()  
  17.          .detectLeakedSqlLiteObjects()  
  18.          .detectLeakedClosableObjects()// API等级11  
  19.          .setClassInstanceLimit(Class.forName("com.apress.proandroid.SomeClass"100)// API等级11  
  20.          .penaltyLog()  
  21.          .build());  
  22.       }  
  23. }  


StrictMode是Android 2.3引入的,在Android 3.0中加入了更多的功能,所以应该确保选择了正确的Android版本,让代码跑在适当的Android平台上,如代码清单1-12所示。

Android 3.0中引入的需要特别留意的方法包括detectCustomSlowCall()和noteSlowCall(),它们都是用来检测应用中执行缓慢的代码或潜在缓慢的代码。代码清单1-16说明了如何将代码标记为潜在缓慢的代码。

代码清单1-16 标记潜在缓慢的代码

  1. public class Fibonacci {  
  2.     public static BigInteger computeRecursivelyWithCache(int n) {  
  3.        StrictMode.noteSlowCall("computeRecursivelyWithCache");// 消息可以带任何信息  
  4.          SparseArray<BigInteger> cache = new SparseArray<BigInteger>();  
  5.          return computeRecursivelyWithCache(n, cache);  
  6.      }  
  7.      ...  
  8. }  
  1.   
  1. public class Fibonacci {  
  2.     public static BigInteger computeRecursivelyWithCache(int n) {  
  3.        StrictMode.noteSlowCall("computeRecursivelyWithCache");// 消息可以带任何信息  
  4.          SparseArray<BigInteger> cache = new SparseArray<BigInteger>();  
  5.          return computeRecursivelyWithCache(n, cache);  
  6.      }  
  7.      ...  
  8. }  



从主线程调用computeRecursivelyWithCache执行时间过长,如果StrictMode Thread 策略配置为检测缓慢调用时,会出现如下日志:

  1. StrictMode policy violation; ~duration=21121 ms:  
  2. android.os.StrictMode$StrictModeCustomViolation: policy=31 violation=8 msg=computeRecursivelyWithCache  

StrictMode policy violation; ~duration=21121 ms:
android.os.StrictMode$StrictModeCustomViolation: policy=31 violation=8 msg=computeRecursivelyWithCache

Android提供了一些辅助方法,可以在主线程里进行临时磁盘读写,如代码

  1. StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();  


 修改线程策略,临时允许磁盘读取

  1. StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();  
  2.  // 从磁盘读取数据  
  3.  StrictMode.setThreadPolicy(oldPolicy);  


目前没有临时允许网络访问的方法,但实在没有理由在主线程中允许这种访问,即使是暂时的,也没有合适的方式知道访问是否很快。有人可能会说,也没有合理的方式知道磁盘访问将是否是快速的,但那是另一场争论。

注意 只在开发阶段启用StrictMode,发布应用时,记得要禁用它。如果你使用detectAll()方法去建立策略总是可行的,那将来更可行,未来的Android版本会检测出更多的不良行为。




http://blog.youkuaiyun.com/t12x3456/article/details/9099209



您可能感兴趣的与本文相关的镜像

Wan2.2-T2V-A5B

Wan2.2-T2V-A5B

文生视频
Wan2.2

Wan2.2是由通义万相开源高效文本到视频生成模型,是有​50亿参数的轻量级视频生成模型,专为快速内容创作优化。支持480P视频生成,具备优秀的时序连贯性和运动推理能力

<think>好的,我需要帮助用户解析优快云博客文章中的代码,特别是页面代码解析的问题。用户提到的“145213286”可能是一个具体的文章ID或示例代码片段。首先,我需要考虑用户可能的需求:他们可能想了解如何提取优快云博客中的代码块,或者分析页面结构来复制或修改代码。 根据提供的引用内容,用户之前的问题涉及到免登录复制代码、修改博客数据以及自定义域名。现在用户想分析页面代码,可能需要技术上的指导,比如使用开发者工具、JavaScript解析DOM,或者处理反爬机制。 首先,我需要确认优快云博客页面的结构。通常,代码块会被包裹在<pre>或<code>标签内,可能有特定的类名,比如“code-content”或“hljs”。用户可能需要定位这些元素来提取代码内容。 接下来,用户可能需要处理登录限制。引用[1]提到可以通过开发者控制台开启文档设计模式来免登录复制,这可能涉及到修改页面属性。如果用户想通过脚本自动化,可能需要使用Tampermonkey等工具,如引用[2]中的示例脚本,拦截请求或修改DOM。 另外,引用[3]提到自定义域名,但当前问题可能不相关,但可能需要考虑跨域问题或HTTPS设置。 用户的需求可能包括如何从页面中提取代码、绕过复制限制、或者自动化处理。需要分步骤解释,比如使用浏览器开发者工具检查元素,编写脚本提取代码,处理可能的动态加载内容,以及应对反爬措施如登录验证。 同时,需要确保回答中使用正确的LaTeX格式,比如变量用$...$,独立公式用$$...$$。例如,解释算法复杂度时,可能需要公式:$O(n \log n)$。 最后,生成相关问题,引导用户深入探讨性能优化、反爬策略或数据可视化等。</think>### 优快云博客页面代码解析方法 #### 一、基础解析流程 1. **定位代码块元素** 优快云代码块通常包裹在`<div class="code-container">`容器内,具体代码位于`<code class="hljs">`标签中。可通过开发者工具(F12)查看元素结构: ```html <div class="code-container"> <pre class="code-content"><code class="language-python hljs">print("Hello 优快云")</code></pre> </div> ``` 2. **JavaScript提取代码** 使用`document.querySelectorAll()`获取所有代码容器: ```javascript const codeBlocks = document.querySelectorAll('.code-container .hljs'); codeBlocks.forEach((block, index) => { console.log(`代码段${index+1}:`, block.textContent); }); ``` #### 二、绕过复制限制 引用[1]的免登录复制方案可通过以下方式实现: 1. 打开浏览器控制台(F12) 2. 输入命令开启文档设计模式: ```javascript document.designMode = "on"; // 解除复制限制[^1] ``` #### 三、动态内容处理 若页面使用异步加载,需监听DOM变化: ```javascript const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (mutation.addedNodes.length) { // 检测新增代码块 } }); }); observer.observe(document.body, { childList: true, subtree: true }); ``` #### 四、数学公式标注示例 当分析算法复杂度时: 快速排序平均时间复杂度为$O(n \log n)$,最坏情况退化为$O(n^2)$。空间复杂度公式: $$ T(n) = 2T(\frac{n}{2}) + O(n) $$
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值