4

StrictMode をセットアップする必要があるコード内の場所の数を最小限に抑えようとしています。しかし、次のことについて、私が正しいかどうかはわかりません。

Android の StrictMode のドキュメントには、アプリケーション、アクティビティ、およびその他のコンポーネントに使用できると記載されています。Application クラスを拡張することは望ましくないことを読みましたが、StrictMode を有効にするためだけに Application を拡張したくないと考えています。しかし、私はそうする必要はないと思います。

使用できるポリシーは 2 つあります。ThreadPolicy (スレッド用) と VmPolicy (すべてのスレッド用) です。そのため、スレッドで StrictMode を一度セットアップすると、どこからそれを行うかは問題ではなく、その後、他の呼び出しに関係なく、または StrictMode に関係なく、そのスレッドで違反が報告されるように思われます。検出したい違反が発生する前に、どこかから呼び出す必要があります。また、自分のアプリケーションで作成された、チェックしたい新しいスレッド用にセットアップする必要があります。

私が避けたいと思うのは、必要以上に build() メソッドを呼び出すことです。すべてのアクティビティの先頭に StrictMode を配置するonCreate()と、そのスレッドで build() が複数回呼び出されることになります。アプリケーションに Launcher アクティビティが 1 つある場合、そのアクティビティで StrictMode を設定するだけでonCreate()、アプリケーションの残りの部分で十分なはずです。本当?

第 2 に、アプリケーションが終了していなくてもメイン アクティビティが再開された場合、技術的に StrictMode を再度呼び出す必要がありますか? それとも、私のスレッドはまだ違反を報告するように設定されていますか? 次のように、StrictMode の周りにラッパー型のクラスを作成することに価値があるのではないかと考えていました。

public class MyStrictModeSettings {
    static private List<Long> setThreads = new ArrayList<Long>();

    // Prevent instantiation of this class
    private MyStrictModeSettings() {}

    static public synchronized void init() {
        try {
            Long tid = Thread.currentThread().getId();
            if(!setThreads.contains(tid)) {
                setThreads.add(tid);
                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...");
        }
    }
}

そうすれば、メイン アクティビティの onCreate() で、MyStrictModeSettings.init() を呼び出すだけで完了できます。Android 2.3 より前のバージョンでも動作するはずです。しかし、それは価値がないかもしれません。ブラッド、そこにいる?ありがとう。

編集: VmPolicy はすべてのスレッド用であるため、技術的には、アプリケーションごとに 1 回だけ設定する必要がありますよね? enableDefaults() は、2 回目、3 回目などに呼び出されたときに VmPolicy をやり直すのに無駄な労力を費やしていますか? 繰り返しますが、余分な呼び出しを避けることは、価値があるよりも面倒なことかもしれません。

4

2 に答える 2

7

はい、VmPolicy はプロセス全体を対象としているため、一度実行すれば問題ありません。ただし、回数が多いほど安いので、心配する必要はありません。

はい、メイン/ランチャー アクティビティの onCreate() でのみ実行する必要があります。これは、他のすべてのコンポーネントと同じ「メイン」スレッドです。

于 2011-01-18T23:09:44.593 に答える