3

これらのエラーの両方に関する大量の投稿を読みましたが、自分に合った解決策が見つからないようです。動物の基本的なリストビュー活動があります。リスト内の項目をクリックすると、AnimalViewActivity が開き、ImageView 内に単純な png 画像が表示されます。

ImageView の画像を設定する場所は次のとおりです。

public void getImage() {

    String imageName = myService.yourAnimals.get(key).getType();
    System.out.println(imageName);

    Resources res = getResources();
    int resourceId = res.getIdentifier(imageName, "drawable", getPackageName() );
    Drawable drawable = res.getDrawable( resourceId );
    image.setImageDrawable( drawable );
}

次に、AnimalViewActivity を離れてリストビュー アクティビティに戻るときは、次のようにします。

@Override
protected void onDestroy() {
    super.onDestroy();
    //((BitmapDrawable)image.getDrawable()).getBitmap().recycle();
    image.getDrawable().setCallback(null);
    //System.gc();
    System.out.println("Destroy image!");
}

recycle() 行のコメントを外すと、「リサイクルされたビットマップを描画できません」というエラーが表示されます。そのままにしておくと、bitmapfactory の outofmemory エラーが発生します。

java.lang.IllegalArgumentException: リサイクルされたビットマップを描画できません または java.lang.OutOfMemoryError android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)

ViewAnimalActivity を約 20 回開いた後、これらのエラーのいずれかが発生し、アプリがクラッシュします。System.gc() だけが永遠に機能するように見えますが、それが良い解決策ではないことはわかっています。

私はandroid4.1でテストしていますが、minSDKはandroid3.0に設定されています

ビットマップのリサイクルに関する javaVM エラーが 3.0 で修正されたということを読みましたか?

なんらかの理由で、gc を明示的に呼び出さないと、ガベージ コレクションの速度が十分ではありません。これらの画像は小さく、ほとんどが 100 ~ 300kB です。

何か案は?

編集:
image.setImageDrawable( null ); の方が幸せそうです。

以前、Android2.2で設定したときに試したと思いますが、Android3.0は今のところ満足しています。

4

2 に答える 2

0

最初にドローアブルをnullに設定してから、リサイクルしてみませんか?問題はおそらく、リサイクルしたときにドローアブルが画像上に残っているため、「リサイクルされたビットマップを描画できない」エラーが発生するためです。最初にそれをnullに設定し、それによって実際のImageView(または使用しているもの)をnullに設定してからリサイクルすると、おそらく問題は解決します。

編集:WOOPS!ドローアブルをnullに設定すると、リサイクルしようとしているビットマップを取得できなくなります。最初にそれを変数に割り当ててから、それをリサイクルしてみてください。

于 2013-03-08T00:45:36.147 に答える