設置嚴苛模式(StrictMode)的線程策略
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() .penaltyLog() .build());
Builder類使得設置變得很簡單,Builder函數定義所有策略都返回Builder對象,從而這些函數能像列表2-9那樣串連在一起。最後調用build()函數返回一個ThreadPolicy對象作為StrictMode對象的setThreadPolicy()函數的參數。注意到setThreadPolicy()是一個靜態函數,因此不需要實例化StrictMode對象。在內部,setThreadPolicy()將對當前線程應用該策略。如果不指定檢測函數,也可以用detectAll()來替代。penaltyLog()表示將警告輸出到LogCat,你也可以使用其他或增加新的懲罰(penalty)函數,例如使用penaltyDeath()的話,一旦StrictMode消息被寫到LogCat後應用就會崩潰。
僅在調試模式設置嚴苛模式(StrictMode)
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());
}
利用反射技術(reflection)調用嚴苛模式(StrictMode)
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...");
}
在Anroid2.3之前版本建立嚴苛模式(StrictMode)封裝類
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());
}
}
}
在Anroid2.3之前版本調用嚴苛模式(StrictMode)封裝類
try {
StrictModeWrapper.init(this);
}
catch(Throwable throwable) {
Log.v("StrictMode", "... is not available. Punting...");
}
如果考慮到關於版本兼容問題,因為按照上面的寫法在2.3以下系統是沒有問題的,但是在2.3及以上的話,就會出錯,所以應該采用以下方式來處理:
@SuppressLint("NewApi")
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) {
try {
//Android 2.3及以上調用嚴苛模式
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...");
}
}
}
這樣的話就解決了版本問題帶來的異常情況。