0

基本的にImageViewUIに4つあり、それらに画像を設定したい。関連するコードは次のとおりです。

private void showPhoto() {
    // (re)set the image button's image based on our photo
    Photo p = mCrime.getPhoto();
    BitmapDrawable b = null;
    if (p != null) {
        String path = getActivity()
            .getFileStreamPath(p.getFilename()).getAbsolutePath();
        Log.i(TAG,"shown picture name is: "+p.getFilename());
//            b = PictureUtils.getScaledDrawable(getActivity(), path);


           // Log.i(TAG,"entered!");
        if (cachedImageNames.size()==0)
            cachedImageNames.add(0,path);
        else{
            boolean isExisted = false;
            for (String imagePath: cachedImageNames){
                if (imagePath.equals(path)){
                    isExisted = true;
                    break;
                    //cachedImageNames.add(0,path);

                }
            }
            if (!isExisted)
                cachedImageNames.add(0,path);
        }


    }
    mCrimes = CrimeLab.get(getActivity()).getCrimes();
//        mPhotoView.setImageDrawable(b);

    Log.i(TAG,"image names' list size is: "+cachedImageNames.size());

    if(!(cachedImageNames.size()<imageViews.size())){
        for (int i=0; i<imageViews.size(); i++){

            b= PictureUtils.getScaledDrawable(getActivity(), cachedImageNames.get(i));
            imageViews.get(i).setImageDrawable(b);
        }
    }
    else{
        for (int i=0; i<cachedImageNames.size(); i++){
            b= PictureUtils.getScaledDrawable(getActivity(), cachedImageNames.get(i));
            imageViews.get(i).setImageDrawable(b);
        }
    }

}

コンソールでは、次の行が示されています。

b= PictureUtils.getScaledDrawable(getActivity(),cachedImageNames.get(i));

次のようなエラーが発生します。

 java.lang.OutOfMemoryError: Failed to allocate a 51916812 byte allocation with 16777216 free bytes and 36MB until OOM 

私は本当に初めてandroidです...何か提案はありますか?

4

1 に答える 1

1

Android搭載デバイスには多すぎる50MBのRAMをヒープに割り当てようとしています。これが本当に必要な場合は、次を追加できます。

  android:largeHeap="true"

<application>マニフェストの一部。しかし、これは通常、推奨されないソリューションです。ほとんどのアプリはこれを必要とせず、代わりに全体的なメモリ使用量を減らしてパフォーマンスを向上させることに重点を置く必要があります。一部のデバイスは使用可能なメモリの合計によって制約されるため、これを有効にしても、使用可能なメモリが固定的に増加することは保証されません。


適切な解決策:

開いている画像の数とサイズを調べる必要があります。非常によくある誤解は、通常、ファイル サイズがメモリ内で使用されているものであると想定しているということです。これは非常に間違った仮定です。PNG、JPG などは圧縮形式です。デバイスに画像をロードすると、各ピクセルは 4 バイトになります。2000x2000 ピクセルの画像がある場合、読み込み時に 16MB の RAM を消費します。これは通常、一般的な (ゲーム以外の) アプリの上限です。

  • フルサイズの画像をロードする必要がない場合は、options.inJustDecodeBounds 手法を調べることをお勧めします。
  • 表示されている画面ですべての画像を使用していない場合は、キャッシュ技術を使用する必要があります。
于 2015-03-01T05:41:01.973 に答える