1

サーバーから ImageView に画像をロードするリストビューがあります。Listview はビューホルダー パターンを実装し、行の非常に単純な相対レイアウトを備えています。画像の遅延読み込みについては、universalimageloader の picasso を試しましたが、現在は google volley に基づいた glide を使用しています。ただし、プレースホルダー画像をサーバー画像に置き換えている間、リストビューはまだ途切れており、理由がわかりません。アダプターコードは次のとおりです。

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View rowView = convertView;
        News newsItem = getItem(position);

        if (rowView == null) {
            LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            rowView = inflater.inflate(mResource, null);
            // Create a viewHolder enabled row
            NewsViewHolder viewHolder = new NewsViewHolder();
            viewHolder.newsTitle = (TextView) rowView.findViewById(R.id.news_title);
            viewHolder.newsSubTitle = (TextView) rowView.findViewById(R.id.news_sub_title);
            viewHolder.newsDescription = (TextView) rowView.findViewById(R.id.news_desc);
            viewHolder.newsDate = (TextView) rowView.findViewById(R.id.news_date);
            viewHolder.newsThumb = (ImageView) rowView.findViewById(R.id.news_thumb);
            rowView.setTag(viewHolder);
        }
        NewsViewHolder holder = (NewsViewHolder) rowView.getTag();

        // Fill in fields of the current row of the NewsListView
        holder.newsTitle.setText(newsItem.title);
        holder.newsSubTitle.setText(newsItem.subTitle);
        holder.newsDescription.setText(newsItem.desciption);
        holder.newsDate.setText(SimpleDateFormat.getDateInstance().format(new Date(Long.parseLong(newsItem.date) * 1000)));

        Glide.load(newsItem.imageThumb)
                .centerCrop()
                .placeholder(R.drawable.placeholder)
                .into(holder.newsThumb);

        return rowView;
    }
}

/*
 * ViewHolder class for NewsListView
 */
public static class NewsViewHolder {
    public TextView newsTitle;
    public TextView newsSubTitle;
    public TextView newsDescription;
    public TextView newsDate;
    public ImageView newsThumb;
}

初めてリストをスクロールしている間だけリストが途切れるので、画像を取得してグライドでリストに貼り付けます。画像がリストビューに貼り付けられた後、スクロールは最初からバターのようにスムーズです。

私は何を間違えましたか?ハングアップの原因を効率的に見つけるにはどうすればよいですか? 私は Traceview の専門家ではなく、ふるいにかけるために大量のデータを生成しています。

助けてくれてありがとう!

4

3 に答える 3

1

logcat を見てください。おそらく、ガベージ コレクター (GC) が新しいビットマップ用にヒープを再割り当てしようとしているために、スタッタリングが発生している可能性があります ( GC_FOR_ALLOCログが表示されるはずです)。その場合、やることはあまりありません... ART は GC の動作を大幅に改善しました (ART で試してみてください)。

ビットマップがすべて同じサイズである場合は、ビットマップを再利用して、ランタイムが新しいビットマップにさらに多くのスペースを割り当てる必要がないようにすることができます。

https://developer.android.com/training/displaying-bitmaps/manage-memory.html#inBitmap

Glide を使用している場合は、ビットマップ プールを事前に入力して同じことを行うことができます。

于 2014-11-26T16:16:50.317 に答える