2012-08-31 59 views
2

我正在使用基於網絡的android項目,因此,爲了防止由於Can't do network operation on UI Thread而導致在Android ICS上強行關閉,我必須使用下面的代碼部分或嘗試在其他線程上啓動我的網絡操作,但我不想更改基本代碼,所以我應該在Android ICS上使用以下代碼。 :Android中的StrictMode類

static { 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() 
      .permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 
} 

我該如何讓獨特的apk文件在所有android版本(> = 1.6)中運行? android.os.StrictMode可用於更高版本的Android,因此,我無法嘗試在我的Android活動中使用上述部分代碼。因此,該解決方案是更好:

  1. 用思考來運行的代碼更高版本的API,這部分(As oracle docs, reflective operations have slower performance than their non-reflective counterparts
  2. 我的Android構建目標更改到Android 4.1.1(API 16),並嘗試改變AndroidManifest.xml上的android:minSdkVersion

或者如果您知道任何更好的,請告訴我。

感謝提前:)

+0

更改您的代碼並將其移出UI線程。 UI線程上的網絡甚至比反射慢 – zapl

+0

好主意,但它有更多的時間花費!我想在不改變網絡和UI線程衝突的情況下做到這一點。 :) –

回答

1

您可以使用BUILD.VERSION和反射來克服這個問題保持兼容(測試)。

if (Integer.valueOf(android.os.Build.VERSION.SDK_INT) >= 9) { 
     try { 
      // StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.LAX); 
      Class<?> strictModeClass = Class.forName("android.os.StrictMode", true, Thread.currentThread() 
        .getContextClassLoader()); 
      Class<?> threadPolicyClass = Class.forName("android.os.StrictMode$ThreadPolicy", true, Thread.currentThread() 
        .getContextClassLoader()); 
      Field laxField = threadPolicyClass.getField("LAX"); 
      Method setThreadPolicyMethod = strictModeClass.getMethod("setThreadPolicy", threadPolicyClass); 
      setThreadPolicyMethod.invoke(strictModeClass, laxField.get(null)); 
     } catch (Exception e) { 
     } 
    } 
+0

但是_StrictMode_沒有在android API 6中定義!所以,我應該用minSdk 6將我的Android目標更改爲Android 4.1.1? –

+0

StrictMode可從API級別9獲得。我認爲你應該有1.6的minSdk,targetSdkVersion更適合行爲/外觀變化,所以如果你需要它,你也可以設置它。 – auselen

+0

我已經定義了我的android目標到Android 4.1.1並將minSdk更改爲6,因此,我在我的Activity中使用了您的代碼部分,所以問題是:'調用需要API級別9(當前最小值爲6) :android.os.StrictMode#setThreadPolicy'和eclipse的提示使用'@SuppressLint(「NewApi」)或'@TargetApi(9)'。我該怎麼辦 ? –

相關問題