0

したがって、このエラー メッセージの右側に理由が示されているわけではありません。なぜこれが起こっているのか正確にはわかりませんが、高品質のドローアブルが約 50 個あるという事実に関係しているのではないかと推測しています。非常に速くスクロールすると、アプリがクラッシュします。View Holders を使用したり、インフレータを 1 回だけ起動したりするなど、ListView とクラッシュに関する最も一般的な問題を軽減しているように感じます。

Process: com.example.michael.myandroidappactivity, PID: 20103
java.lang.OutOfMemoryError
        at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)

ここにコードがあります

public class ImageAdapter extends BaseAdapter
{
private Context context;
private ArrayList<Integer> imageIds;
private static LayoutInflater inflater;

public ImageAdapter(Context _context, ArrayList<Integer> _imageIds)
{
    context = _context;
    imageIds = _imageIds;
}

@Override
public int getCount()
{
    return imageIds.size();
}

@Override
public Object getItem(int position)
{
    return null;
}

@Override
public long getItemId(int position) {
    return 0;
}

static class ViewHolder{
    ImageView img;
}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{

    ViewHolder holder = null;
    View rowView = null;

    if(rowView==null) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        rowView = inflater.inflate(R.layout.listview_layout, parent, false);
        holder = new ViewHolder();
        holder.img = (ImageView) rowView.findViewById(R.id.flag);
        rowView.setTag(holder);
    }
    else
    {
        holder = (ViewHolder) rowView.getTag();
    }
    holder.img.setImageResource(imageIds.get(position));
    return rowView;
  }
}
4

4 に答える 4

2

あなたがアダプターで何をしようとしているのか本当にわかりませんが、論理エラー/トートロジーがあります。

rowViewnull に割り当てて、null直後かどうかを確認します。それは常にありnull、あなたはあなたのViewHolder.

于 2014-08-24T03:29:19.747 に答える
0

Drawables がリソース内でどれだけ圧縮されているかは関係ありません。重要なのは、それらが圧縮されていない大きさです。上で示したように、画像のサイズは 500x726 です。RGB の場合、画像ごとに非圧縮で約 1MB になります。

いくつかの提案:

可能であれば、画像を縮小してください。Photoshop、Gimp、Paint.Net、または MSPaint を使用して画像を 250x363 にスケーリングした場合は、問題ないと思います。または、ScalableDrawable クラスを見てください。

画面上にない Drawable への参照を保持しないようにします。

ListView では、URLImageViewHelperを使用して参照と LRU キャッシュを管理しました。

于 2014-08-24T20:03:51.510 に答える
0

@PeekaySwitch が強調したエラーとは別に、リストに HD 画像は本当に必要ないことを強調したいだけです。今日のデバイスの一般的な HD 画面の解像度は1920x1080です。これが、1 つの画面に表示できる最大の品質です。しかし、画面の一部が他のグラフィック コンポーネントによって占有されているという事実を考慮すると、リストがあり、画面ごとに表示する画像を少なくしたい場合、画像ごとの画面セクションが大幅に削減されます。大量のHD画像をロードしますが、画面上ではおそらく1/10 未満で表示されますそのサイズの不必要なメモリの使用を意味します。したがって、画像を扱うときはアプローチを再考することをお勧めします。リストの各項目ごとに表示されるサムネイルまたは sth を作成することができます。たとえば、ユーザーがクリックしたときの画像全体。さらに、Android で利用可能な LRU などのキャッシュ メカニズムを適用することを検討できます。

于 2014-08-24T04:16:24.180 に答える
0

LRUCacheを使用して画像をキャッシュする必要があります

これはよく知られた問題であるため、問題を解決するための優れた方法があります。

Android-Universal-Image-Loader

許容される URI の例:

String imageUri = "http://url/image.png"; // from Web
String imageUri = "file:///mnt/sdcard/image.png"; // from SD card
String imageUri = "content://media/external/audio/albumart/13"; // from content provider
String imageUri = "assets://image.png"; // from assets
String imageUri = "drawable://" + R.drawable.image; // from drawables (only images, non-9patch)

// Load image, decode it to Bitmap and display Bitmap in ImageView (or any other view 
// which implements ImageAware interface)

imageLoader.displayImage(imageUri, imageView);
于 2014-08-24T03:40:09.497 に答える