日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

严苛模式(StrictMode)

發(fā)布時(shí)間:2025/3/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 严苛模式(StrictMode) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
? Android 2.3提供一個(gè)稱(chēng)為嚴(yán)苛模式(StrictMode)的調(diào)試特性,Google稱(chēng)該特性已經(jīng)使數(shù)百個(gè)Android上的Google應(yīng)用程序受益。那它都做什么呢?它將報(bào)告與線程及虛擬機(jī)相關(guān)的策略違例。一旦檢測(cè)到策略違例(policy violation),你將獲得警告,其包括了一個(gè)棧trace顯示你的應(yīng)用在何處發(fā)生違例。你能夠強(qiáng)制用警告取代崩潰(crash),也能夠僅將警告計(jì)入日志,讓你的應(yīng)用繼續(xù)運(yùn)行。策略的細(xì)節(jié)尚難確定,能夠期待隨Android的成熟Google將添加很多其它策略。

??? 眼下有2種策略可用,第一個(gè)和線程相關(guān),它主要針對(duì)主線程(或UI線程)。因?yàn)樵谥骶€程中讀寫(xiě)磁盤(pán)和進(jìn)行網(wǎng)絡(luò)訪問(wèn)都不是好的做法,Google已經(jīng)在磁盤(pán)和網(wǎng)絡(luò)代碼中加入了嚴(yán)苛模式(StrictMode)鉤子(hook)。假設(shè)你對(duì)某個(gè)線程打開(kāi)嚴(yán)苛模式(StrictMode),當(dāng)那個(gè)線程進(jìn)行磁盤(pán)和網(wǎng)絡(luò)訪問(wèn),你將獲得警告。你能夠選擇警告方式。一些違例包括用戶(hù)慢速調(diào)用(custom slow calls 這么翻譯行嗎?),磁盤(pán)讀寫(xiě),網(wǎng)絡(luò)訪問(wèn)。你能選擇將警告寫(xiě)入LogCat,顯示一個(gè)對(duì)話框,閃下屏幕,寫(xiě)入DropBox日志文件,或讓?xiě)?yīng)用崩潰。最通常的做法是寫(xiě)入LogCat或讓?xiě)?yīng)用崩潰。列表2-9顯示了一個(gè)為線程策略設(shè)置嚴(yán)苛模式(StrictMode)的樣例。

列表2-9 設(shè)置嚴(yán)苛模式(StrictMode)的線程策略

view plainprint?
  • StrictMode.setThreadPolicy(new?StrictMode.ThreadPolicy.Builder()??
  • ????.detectDiskReads()??
  • ????.detectDiskWrites()??
  • ????.detectNetwork()??
  • ????.penaltyLog()??
  • ????.build());??
  • ??? Builder類(lèi)使得設(shè)置變得非常easy,Builder函數(shù)定義全部策略都返回Builder對(duì)象,從而這些函數(shù)能像列表2-9那樣串連在一起。最后調(diào)用build()函數(shù)返回一個(gè)ThreadPolicy對(duì)象作為StrictMode對(duì)象的setThreadPolicy()函數(shù)的參數(shù)。注意到setThreadPolicy()是一個(gè)靜態(tài)函數(shù),因此不須要實(shí)例化StrictMode對(duì)象。在內(nèi)部,setThreadPolicy()將對(duì)當(dāng)前線程應(yīng)用該策略。假設(shè)不指定檢測(cè)函數(shù),也能夠用detectAll()來(lái)替代。penaltyLog()表示將警告輸出到LogCat,你也能夠使用其它或添加新的懲處(penalty)函數(shù),比如使用penaltyDeath()的話,一旦StrictMode消息被寫(xiě)到LogCat后應(yīng)用就會(huì)崩潰。

    ??? 你不須要頻繁打開(kāi)嚴(yán)苛模式(StrictMode),你能夠在主活動(dòng)的onCreate()函數(shù)中打開(kāi)它,你也能夠在Application派生類(lèi)的OnCreate()函數(shù)中設(shè)置嚴(yán)苛模式(StrictMode)。線程中執(zhí)行的不論什么代碼都能夠設(shè)置嚴(yán)苛模式(StrictMode),但你的確僅僅須要設(shè)置一次,一次就夠了。

    ??? 類(lèi)似于線程策略(ThreadPolicy),嚴(yán)苛模式(StrictMode)有虛擬機(jī)策略(VmPolicy)。虛擬機(jī)策略(VmPolicy)能檢查內(nèi)存泄漏,譬如,當(dāng)關(guān)閉一個(gè)SQLite對(duì)象前的完結(jié)操作,或其它不論什么類(lèi)似可關(guān)閉對(duì)象在關(guān)閉前的完結(jié)操作。虛擬機(jī)策略(VmPolicy)由一個(gè)類(lèi)似的Builder類(lèi)創(chuàng)建,如列表2-10所看到的。和線程策略(ThreadPolicy)不同的是,虛擬機(jī)策略(VmPolicy)不能通過(guò)一個(gè)對(duì)話框提供警告。

    列表2-10 設(shè)置嚴(yán)苛模式(StrictMode)的虛擬機(jī)策略

    view plainprint?
  • StrictMode.setVmPolicy(new?StrictMode.VmPolicy.Builder()??
  • ????.detectLeakedSqlLiteObjects()??
  • ????.penaltyLog()??
  • ????.penaltyDeath()??
  • ????.build());??
  • ??? 由于設(shè)置發(fā)生在線程中,嚴(yán)苛模式(StrictMode)甚至能在從一個(gè)對(duì)象到還有一個(gè)對(duì)象的控制流中找到違例事件。當(dāng)違例發(fā)生,你會(huì)驚奇地注意到代碼正執(zhí)行于主線程,而棧trace將幫助你發(fā)現(xiàn)它怎樣發(fā)生。于是你能單步調(diào)試解決這個(gè)問(wèn)題,或是將代碼移到它自己的后臺(tái)線程,或是就保持原來(lái)的處理方式。這都取決與你。當(dāng)然,你可能希望適時(shí)關(guān)閉嚴(yán)苛模式(StrictMode),當(dāng)你的程序作為產(chǎn)品公布時(shí),你可不希望它僅為了一個(gè)警告在你的用戶(hù)手里崩潰。

    ??? 有兩個(gè)方法能夠關(guān)閉嚴(yán)苛模式(StrictMode),最直接的就是移除對(duì)應(yīng)代碼,但這樣做不利于持續(xù)開(kāi)發(fā)的產(chǎn)品。你通常能夠定義一個(gè)應(yīng)用級(jí)別布爾變量來(lái)測(cè)試是否須要調(diào)用嚴(yán)苛模式(StrictMode)代碼。在公布產(chǎn)品前將這個(gè)值定義為FALSE。更優(yōu)雅的方式是利用調(diào)試模式(debug mode)的特點(diǎn),在AndroidManifest.xml中定義這個(gè)布爾變量。<application>字段的屬性之中的一個(gè)是android:debuggable,其義自明。列表2-11給出了利用該特性的控釋方法。

    列表2-11 僅在調(diào)試模式設(shè)置嚴(yán)苛模式(StrictMode)

    view plainprint?
  • //?Return?if?this?application?is?not?in?debug?mode??
  • ApplicationInfo?appInfo?=?context.getApplicationInfo();??
  • int?appFlags?=?appInfo.flags;??
  • if?((appFlags?&?ApplicationInfo.FLAG_DEBUGGABLE)?!=?0)?{??
  • ????//?Do?StrictMode?setup?here??
  • ????StrictMode.setVmPolicy(new?StrictMode.VmPolicy.Builder()??
  • ????????.detectLeakedSqlLiteObjects()??
  • ????????.penaltyLog()??
  • ????????.penaltyDeath()??
  • ????????.build());??
  • }??
  • ??? 使用Eclipse調(diào)試環(huán)境,ADT自己主動(dòng)為你設(shè)置debuggable屬性,使項(xiàng)目更易于管理。當(dāng)你在模擬器上或直接在設(shè)備上部署應(yīng)用,debuggable屬性為T(mén)RUE,當(dāng)你導(dǎo)出應(yīng)用建立一個(gè)產(chǎn)品版本號(hào),ADT將該屬性置為FALSE。注意,假設(shè)你另行設(shè)置了這個(gè)屬性值,ADT不會(huì)改變它。

    ??? 嚴(yán)苛模式(StrictMode)非常不錯(cuò),只是在Android 2.3之前的版本號(hào)上該模式不工作。為了避免這個(gè)問(wèn)題,你要在StrictMode對(duì)象還不存在的時(shí)候就驗(yàn)證版本號(hào)是否在Android2.3及以上。你能利用反射技術(shù)(reflection),當(dāng)嚴(yán)苛模式(StrictMode)函數(shù)有效時(shí)間接調(diào)用它,反之不去調(diào)用。方法非常easy,你能按列表2-12中的代碼處理

    列表2-12? 利用反射技術(shù)(reflection)調(diào)用嚴(yán)苛模式(StrictMode)

    view plainprint?
  • try?{??
  • ????Class?sMode?=?Class.forName("android.os.StrictMode");??
  • ????Method?enableDefaults?=?sMode.getMethod("enableDefaults");??
  • ????enableDefaults.invoke(null);??
  • }??
  • catch(Exception?e)?{??
  • ????//?StrictMode?not?supported?on?this?device,?punt??
  • ????Log.v("StrictMode",?"...?not?supported.?Skipping...");??
  • }??
  • ??? 當(dāng)嚴(yán)苛模式(StrictMode)不存在,將捕捉到ClassNotFoundException異常。enableDefault()是嚴(yán)苛模式(StrictMode)類(lèi)的還有一個(gè)函數(shù),它檢測(cè)全部違例并寫(xiě)入LogCat。由于這里調(diào)用的是靜態(tài)形式的enableDefault(),所以用null作為參數(shù)傳入。

    ??? 某些時(shí)候你不希望報(bào)告全部違例。那在主線程之外的其它線程中設(shè)置嚴(yán)苛模式(StrictMode)非常不錯(cuò)。譬如,你須要在正在監(jiān)視的線程中進(jìn)行磁盤(pán)讀取。此時(shí),你要么不去調(diào)用detectDiskReads(),要么在調(diào)用detectAll()之后跟一個(gè)permitDiskReads()。類(lèi)似同意函數(shù)也適用于其它操作。但要是你要在Anroid2.3之前版本號(hào)上做這些事,有辦法嗎?當(dāng)然有。

    ??? 當(dāng)應(yīng)用中嚴(yán)苛模式(StrictMode)無(wú)效,假設(shè)你試圖訪問(wèn)它,將拋出一個(gè)VerifyError異常。假設(shè)你將嚴(yán)苛模式(StrictMode)封裝在一個(gè)類(lèi)里,并捕捉這個(gè)錯(cuò)誤,當(dāng)嚴(yán)苛模式(StrictMode)無(wú)效時(shí),你能忽略它。列表2-13顯示一個(gè)簡(jiǎn)單的嚴(yán)苛模式(StrictMode)封裝類(lèi)StrictModeWrapper。列表2-14顯示了怎樣在你的應(yīng)用中使用這個(gè)封裝類(lèi)。

    列表 2–13 在Anroid2.3之前版本號(hào)建立嚴(yán)苛模式(StrictMode)封裝類(lèi)

    view plainprint?
  • import?android.content.Context;??
  • import?android.content.pm.ApplicationInfo;??
  • import?android.os.StrictMode;??
  • public?class?StrictModeWrapper?{??
  • ????public?static?void?init(Context?context)?{??
  • ????????//?check?if?android:debuggable?is?set?to?true??
  • ????????int?appFlags?=?context.getApplicationInfo().flags;??
  • ????????if?((appFlags?&?ApplicationInfo.FLAG_DEBUGGABLE)?!=?0)?{??
  • ????????????StrictMode.setThreadPolicy(new?StrictMode.ThreadPolicy.Builder()??
  • ????????????????.detectDiskReads()??
  • ????????????????.detectDiskWrites()??
  • ????????????????.detectNetwork()??
  • ????????????????.penaltyLog()??
  • ????????????????.build());??
  • ????????????StrictMode.setVmPolicy(new?StrictMode.VmPolicy.Builder()??
  • ????????????????.detectLeakedSqlLiteObjects()??
  • ????????????????.penaltyLog()??
  • ????????????????.penaltyDeath()??
  • ????????????????.build());??
  • ????????}??
  • ????}??
  • }??

  • 列表 2–14? 在Anroid2.3之前版本號(hào)調(diào)用嚴(yán)苛模式(StrictMode)封裝類(lèi)


    view plainprint?
  • try?{??
  • ????StrictModeWrapper.init(this);??
  • }??
  • catch(Throwable?throwable)?{??
  • ????Log.v("StrictMode",?"...?is?not?available.?Punting...");??
  • } ?

  • //假設(shè)考慮到關(guān)于版本號(hào)兼容問(wèn)題,由于依照上面的寫(xiě)法在2.3下面系統(tǒng)是沒(méi)有問(wèn)題的,可是在2.3以上的話,就會(huì)出錯(cuò),所以應(yīng)該採(cǎi)用下面方式來(lái)處理:

    @SuppressLint("NewApi")public static void init(Context context) {// check if android:debuggable is set to trueint appFlags = context.getApplicationInfo().flags;if ((appFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {try {//Android 2.3及以上調(diào)用嚴(yán)苛模式Class sMode = Class.forName("android.os.StrictMode");Method enableDefaults = sMode.getMethod("enableDefaults");enableDefaults.invoke(null);} catch (Exception e) {// StrictMode not supported on this device, puntLog.v("StrictMode", "... not supported. Skipping...");}/** StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()* .detectDiskReads() .detectDiskWrites() .detectNetwork()* .penaltyLog() .build()); StrictMode.setVmPolicy(new* StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects()* .penaltyLog() .penaltyDeath() .build());*/}}

    總結(jié)

    以上是生活随笔為你收集整理的严苛模式(StrictMode)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 久久成人人人人精品欧 | 亚洲女优视频 | 午夜视频福利在线观看 | 好吊日免费视频 | 国产精品久久久久久久av福利 | 成人福利网站在线观看 | 亚洲宗人网 | 国产精品自拍一区 | 男生坤坤放进女生坤坤里 | 国产日韩在线免费观看 | 五月av在线| 亚洲女人的天堂 | 可以看毛片的网站 | 无码人妻精品一区二区三区99v | 精品久久影院 | 朋友人妻少妇精品系列 | 亚洲精品成人在线视频 | 五月激情五月婷婷 | www.天堂av| 日韩一级视频 | 囯产精品一品二区三区 | 怎么可能高潮了就结束漫画 | 国产粉嫩白浆 | 天堂精品一区 | 黄色在线观看网站 | 最色网站 | 久久福利视频网 | 久久国产高清 | 日韩一区二区三区不卡视频 | 免费男女乱淫真视频免费播放 | 少妇激情偷人爽爽91嫩草 | 成人久久久久 | 三上悠亚痴汉电车 | 91黄址| 久久亚洲精少妇毛片午夜无码 | 欧美在线免费看 | 美女主播福利视频 | 国产成人一区二区三区电影 | 午夜黄色av | 亚洲香蕉视频 | 欧美精品影院 | avwww| 丝袜老师办公室里做好紧好爽 | 亚洲最大福利视频网 | 欧美性视频一区二区三区 | 日本精品一区二区三区四区 | 国产一区二区精品在线观看 | 香蕉视频黄色在线观看 | 91精品国自产在线观看 | 亚洲综人网 | 全黄性性激高免费视频 | 国产精品久久久久久久一区探花 | 国产精品自拍合集 | 91插插视频 | 69av在线| 免费伊人网 | 六月婷婷综合网 | 深爱综合网 | 亚洲男女视频在线观看 | 午夜视频久久 | 国内偷拍第一页 | 在线色网址 | 欧美动态视频 | 在线观看不卡的av | 五月婷婷视频在线观看 | 亚洲精品鲁一鲁一区二区三区 | 天天骑夜夜操 | 欧美搞逼视频 | 韩日av网站| 美女扒开让男人桶爽 | 欧美激情一区二区三区在线 | 久久国产精品毛片 | 99热这里只有精品18 | 亚洲av色区一区二区三区 | 99欧美| 亚洲一区二区三区视频 | 不卡影院av | av中文字幕不卡 | 无码人妻aⅴ一区二区三区 国产高清一区二区三区四区 | 亚洲第一黄色片 | 久久精品性 | 夜夜摸夜夜操 | www.色人阁| 黄色电影在线视频 | 人妖videosex高潮另类 | 51av视频 | 原来神马电影免费高清完整版动漫 | 天天操天天干天天插 | 国产精品主播 | 69精品在线观看 | 精品国产1区 | 污污的网站在线观看 | 国产精品国产三级国产普通话蜜臀 | 国产成人av影院 | 18禁免费观看网站 | 人妻一区二区三区视频 | 中文字幕在线观看91 | 在线中文天堂 | 亚洲综合久久av一区二区三区 |