53

ここに記載されているように、開発中に StrictMode を有効にしてアプリを実行しています。下位プラットフォーム バージョンの場合は StrictMode で、 何を考えればよいかわからないというエラー メッセージに気付きました。参照も見つかりません。

とのandroid.os.StrictMode$InstanceCountViolation値を取得します。instanceslimit

インスタンス=3; 制限=2

今私は疑問に思っています:

  • A) 制限はどのように計算されますか
  • B) そのような違反が実際にどのように発生する可能性があり、それから私は回避行動を調べます.

何か案は?

4

6 に答える 6

10

一部のデバイスの StrictMode チェックにバグがあるようです。

アクティビティが開始され、すぐに終了して再開される場合、StrictMode.InstanceCountViolation を取得できます。

ただし、これは単純に、ガベージ コレクターがまだアクティビティの最初のインスタンスを確定していないためです。つまり、一時的にメモリ内に 2 つ (またはそれ以上) のインスタンスが存在します。

startActivity() または startActivityForResult() の前に System.gc() を呼び出すと、StrictMode.InstanceCountViolation が停止します。

これは、StrictMode チェックのバグ (またはおそらく機能?) を示しているようです。

于 2014-03-10T16:51:01.167 に答える
8

StrictMode InstanceCountViolationの処理に関する Google グループに関するディスカッションを次に示します。Android のバージョンごとにポリシーが異なるように見えるため、無効にしているようです。また、Android のドキュメントにはStrict Modeについて書かれています

ただし、StrictMode が検出したすべてを修正する必要はありません。特に、通常のアクティビティ ライフサイクルでは、多くの場合、ディスク アクセスが必要になります。StrictMode を使用して、偶然行ったことを見つけます。ただし、ほとんどの場合、UI スレッドでのネットワーク リクエストが問題になります。

それが @sri が彼のコードで示そうとしていることだと思います。

public class MyApplication extends Application {

@Override 
public void onCreate (){
   super.onCreate();
   // when you create a new application you can set the Thread and VM Policy
   StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
   .detectCustomSlowCalls() // API level 11, to use with StrictMode.noteSlowCode
   .detectDiskReads()
   .detectDiskWrites()
   .detectNetwork()
   .penaltyLog()
   .penaltyFlashScreen() // API level 11
   .build());

//If you use StrictMode you might as well define a VM policy too

   StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
   .detectLeakedSqlLiteObjects()
   .detectLeakedClosableObjects() // API level 11
   .setClassInstanceLimit(Class.forName(“com.apress.proandroid.SomeClass”), 100)
   .penaltyLog()
   .build());
 }
}
于 2013-01-24T09:19:01.123 に答える
3

私の理解では、この違反はメモリ リークを検出するために使用されます。したがって、その時点でクラスのインスタンスは 2 つしかロードされていないはずですが、VM は 3 つを検出しました。

私のコードにもこの違反が見られましたが、余分なインスタンスはすべて弱いポインターによって参照されていました。したがって、このルールを無効にすることにしました。

于 2011-07-13T16:16:04.520 に答える
-3

作成時に以下の行を削除します。

//StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyLog().penaltyDeath().detectLeakedSqlLiteObjects().build());
于 2015-03-23T11:02:19.800 に答える
-3

以下の例を参照してください。Android のバージョンによって異なります。

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
            .detectCustomSlowCalls() // API level 11, to use with StrictMode.noteSlowCode
            .detectDiskReads()
            .detectDiskWrites()
            .detectNetwork()
            .penaltyLog()
            .penaltyFlashScreen() // API level 11
            .build());

        // not really performance-related, but if you use StrictMode you might as well define a VM policy too
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
            .detectLeakedSqlLiteObjects()
            .detectLeakedClosableObjects() // API level 11
            .setClassInstanceLimit(Class.forName(“com.apress.proandroid.SomeClass”), 100) // API level 11
            .penaltyLog()
            .build());
    }
}
于 2013-01-22T11:50:08.290 に答える