在android 2.3上設計的下載程式,在android 4.0上運行時報android.os.NetworkOnMainThreadException異常,原來在4.0中,訪問網路不能在主程式中進行,有兩個方法可以解決。
一個是在主程式中增加:
// 詳見StrictMode文檔 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() // or .detectAll() for all detectable problems .penaltyLog() .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .detectLeakedClosableObjects() .penaltyLog() .penaltyDeath() .build());
另一種是啟動線程執行下載任務:
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.main); // 啟動線程執行下載任務 new Thread(downloadRun).start(); } /** * 下載線程 */ Runnable downloadRun = new Runnable(){ @Override public void run() { // TODO Auto-generated method stub updateListView(); } };
Android中SharedPreferences的模式
MODE_MULTI_PROCESS
這個值是一個標誌,在Android 2.3及以前,這個標誌位都是預設開啟的,允許多個進程訪問同一個SharedPrecferences對象。而以後的Android版本,必須通過明確的將MODE_MULTI_PROCESS
這個值傳遞給mode參數,才能開啟多進程訪問。
我們在獲得SharedPreferences的時候,需要判斷一下SDK的版本號碼:
int __sdkLevel = Build.VERSION.SDK_INT; SharedPreferences __sp = $context.getSharedPreferences(SETTING_NAME, (__sdkLevel > Build.VERSION_CODES.FROYO) ? 4 : 0);