4

Android 4.1 デバイスで動作しない古いアプリがあります。ここでジャンプするのは NetworkOnMainThreadException です。

そこで、次の手順でこれを許可しようとしましたが、うまくいきません。4.1エミュレーターでテストしました。そのエラーを回避するために本当に必要なもの - アプリの書き換えはオプションではありません。現在、アプリから 4.1 デバイスを除外しています。

クラスファイル...

public class StrictModeWrapper {

    static {
        try {
            Class.forName("android.os.StrictMode");
        } catch (Exception exception) {
            throw new RuntimeException(exception);
        }
    }

    public static void checkAvailable() {
    }

    @SuppressLint("NewApi")
    public static void setThreadPolicy() {
        StrictMode.ThreadPolicy strictModeThreadPolicy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(strictModeThreadPolicy);
    }
}

... 拡張された Application クラスで呼び出されます:

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        try {
            StrictModeWrapper.checkAvailable();
            StrictModeWrapper.setThreadPolicy();
            } catch (Throwable throwable) {
        }
    }
}

拡張された Application クラスがマニフェストに登録され、機能します。

4

2 に答える 2

2

Android バージョン >= 16 での StrictMode の動作は、以前のリリースとは異なります。ドキュメントは、拡張されたアプリケーション、アクティビティなどの onCreate() で StrictMode 呼び出しを発行することを提案しています。拡張されたアプリケーションの少なくとも onCreate() は、現在は異なる動作をし、ドキュメントが間違っていることを証明しています (今日の時点で)。

たとえば、拡張アプリケーションに StrictMode 呼び出しを追加する方法を説明する StrictMode doc を次に示します (これは、今日では間違っています)。

厳格モード

問題を説明し、回避策を提供する Google コードの問題を次に示します。

Google コードの問題 35298

于 2012-07-26T09:35:49.780 に答える
2

API 11 以降、何も変更されてStrictModeいないようです。StrictMode ポリシー違反の原因となったのは、使用した他の Android クラスの変更に違いありません。

Androidのドキュメント自体は言う

「しかし、StrictMode が検出したものすべてを修正する必要はありません。」

しかし、そのためNetworkOnMainThreadException、徹底的なチェックを行う必要があります。アプリ内のすべてのネットワーク通信を確認し、それらがメイン スレッドをブロックしていないことを確認します。

StrictModeまた、偶発的なミスを特定するための開発者ツールにすぎないため、リリース ビルドのコードを削除/無効にしてください。

アップデート:

アプリがクラッシュした理由:

  • リリース ビルドで StrictMode ポリシー設定コードの実行をブロックしていません。テスト中にのみ実行する必要があります。
  • クラスの変更StrictModeにより、厳密モード ポリシーが の後にリセットされましたonCreate

2 つの質問があります。

  1. クラッシュは、StrictMode ポリシーが機能していたことを示していませんか? ポリシー違反があったため、クラッシュしました。
  2. アプリにメイン スレッドをブロックするネットワーク コードがあることを示しているのではないですか?
于 2012-07-25T17:54:28.157 に答える