Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 由於Android版本問題StrictMode模式下訪問網絡報錯的解決辦法 絕對經典

由於Android版本問題StrictMode模式下訪問網絡報錯的解決辦法 絕對經典

編輯:關於Android編程

設置嚴苛模式(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...");    }        }  }   這樣的話就解決了版本問題帶來的異常情況。  
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved