7

いくつかの画像を含む以下の画面があります(表示されているページごとに6つ)。上下にスクロールするのは私にはかなり遅れているようです。それは、画像を再びレンダリングしているようなものです。上にスクロールすると、下にスクロールするよりも悪いようです。

そのような領域でパフォーマンスを向上させて、スムーズなスクロールを作成する方法を知っている人はいますか?

更新:画像とテキストはすべて私のSQLiteデータベースから取得されます。リストはSimpleCursorAdapterを使用して作成されます。

ギャラリー

private class HistoryViewBinder implements SimpleCursorAdapter.ViewBinder 
{
    //private int wallpaperNumberIndex;
    private int timeIndex;
    private int categoryIndex;
    private int imageIndex;

    private java.text.DateFormat dateFormat;
    private java.text.DateFormat timeFormat;
    private Date d = new Date();

    public HistoryViewBinder(Context context, Cursor cursor) 
    {
        dateFormat = android.text.format.DateFormat.getDateFormat(context);
        timeFormat = android.text.format.DateFormat.getTimeFormat(context);

        //wallpaperNumberIndex = cursor.getColumnIndexOrThrow(HistoryDatabase.KEY_WALLPAPER_NUMBER);
        timeIndex = cursor.getColumnIndexOrThrow(HistoryDatabase.KEY_TIME);
        categoryIndex = cursor.getColumnIndexOrThrow(HistoryDatabase.KEY_CATEGORY);
        imageIndex = cursor.getColumnIndexOrThrow(HistoryDatabase.KEY_IMAGE);
    }

    @Override
    public boolean setViewValue(View view, Cursor cursor, int columnIndex) 
    {
        Log.d(TAG, "setViewValue");

        if (view instanceof TextView)
        {
            Log.d(TAG, "TextView");
            TextView tv = (TextView) view;

            if (columnIndex == timeIndex)
            {
                Log.d(TAG, "timeIndex");
                d.setTime(cursor.getLong(columnIndex));
                tv.setText(timeFormat.format(d) + "  " + dateFormat.format(d));
                return true;
            }
            else if (columnIndex == categoryIndex)
            {
                Log.d(TAG, "categoryIndex");
                tv.setText(cursor.getString(columnIndex));
                return true;
            }
        }
        else if (view instanceof ImageView)
        {
            Log.d(TAG, "ImageView");
            ImageView iv = (ImageView) view;

            if (columnIndex == imageIndex)
            {
                Log.d(TAG, "imageIndex");
                byte[] image = cursor.getBlob(columnIndex);
                Bitmap bitmapImage = BitmapFactory.decodeByteArray(image, 0, image.length);
                iv.setImageBitmap(bitmapImage);
                return true;
            }
        }

        return false;
    }
}
4

3 に答える 3

6

問題は、ビューが表示できるように準備された時点で各画像がデコードされることです。ListViewはビューをリサイクルします。つまり、ビューが画面を離れた時点で再利用されるため、画像が上書きされ、ガベージコレクションが行われます。アイテムが画面に再び入る場合は、画像をデータベースから再度デコードする必要があります。

デコードはかなり高速ですが、ユーザーがリスト内の位置を非常にすばやく変更すると、すべてのデコード呼び出しによってリストが非常に遅くなります。

ImageCacheのようなものを実装します。画像への弱参照を持つマップを保持するクラス。画像を表示するたびに、画像がすでにマップにあるかどうか、WeakReferenceがオブジェクトを指しているかどうかを確認します。そうでない場合は、画像をデコードしてからマップに保存する必要があります。

遅延読み込みの質問を見てください。これらは、デコードをバックグラウンドタスクに配置し、画像が読み込まれた瞬間にリストを更新する方法を示します。これはもう少し手間がかかりますが、リストをはるかに高速にすることができます。遅延読み込みの質問のコード例を使用する場合は、スレッドの代わりにAsyncTasksを使用してデコードを実行してみてください。

于 2010-09-07T06:54:12.610 に答える
2

これがsthであり、あなたが読むべきものであり、問​​題を解決するのに役立つはずです(ビットマップの効率的な表示の一部): http ://developer.android.com/training/displaying-bitmaps/process-bitmap.html

于 2014-08-07T10:59:12.603 に答える
0

画像が適切なサイズでない場合は、その場で拡大縮小されます。これは、特に大きな画像の場合、安価な操作ではありません。データベースから壁紙ではなくサムネイルをロードしていることを確認してください。

また、Traceviewを使用して、時間を費やしている場所を見つけることができます。

于 2010-09-06T13:28:36.533 に答える