2

私はAndroidでネットワークベースのプロジェクトに取り組んでいるので、Android ICSが原因で強制終了するのを防ぐためにCan't do network operation on UI Thread、以下のようなコードの一部を使用するか、他のスレッドでネットワーク操作を開始しようとする必要がありますが、変更したくありません基本コードなので、Android ICS では以下のコードを使用する必要があります。:

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

すべての Android バージョン (>= 1.6) で実行する一意の apk ファイルを作成するにはどうすればよいですか? android.os.StrictModeAndroidの上位バージョンでアクセスできるため、Androidアクティビティで上記のコード部分を使用しようとすることはできません. したがって、どのソリューションが優れているか:

  1. リフレクションを使用して、API の上位バージョンでコードのこの部分を実行する ( As oracle docs, reflective operations have slower performance than their non-reflective counterparts)
  2. Android ビルド ターゲットを Android 4.1.1 (API 16) に変更しandroid:minSdkVersion、AndroidManifest.xmlを変更してみます

もしくは他に良いものをご存知でしたら教えてください。

前もって感謝します :)

4

1 に答える 1

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) {
        }
    }
于 2012-08-31T11:52:19.833 に答える