1

複数の写真を選択できるフォト ギャラリーを作成しましたが、GridView にサムネイルを表示するのが非常に遅くなる場合があることに気付きました。私はタイマーを使用します:

timer = new Timer();
timer.schedule(new TimerTask() {        
    @Override
    public void run() {
        fetchNextThumb();
    }
}, 0, 25);

GridView でサムネイルのない子を検索し (無効にしておく)、MediaStore から適切なサムを取得します (まだキャッシュされていない場合)。UI スレッドで setImageBitmap() を実行します。

private void fetchNextThumb()
{
    for (int i = 0; i < gridView.getChildCount(); i++)
    {
        ImageSelectView isv = (ImageSelectView)gridView.getChildAt(i);
        if (isv == null)
            continue;
        if (isv.isEnabled())
            continue;
        activeThumb = thumbCache.get(isv.getId());
        if (activeThumb == null)
        {
            activeThumb = MediaStore.Images.Thumbnails.getThumbnail(getContentResolver(), isv.getId(), MediaStore.Images.Thumbnails.MICRO_KIND, null);
            thumbCache.put(isv.getId(), activeThumb);
        }
        activeView = isv;
        runOnUiThread(setNextThumb);
        return;
    }
}
private Bitmap activeThumb;
private ImageSelectView activeView;
private Runnable setNextThumb = new Runnable() {
    public void run() {
        activeView.setImageBitmap(activeThumb);
        activeView.invalidate();
        activeView.setEnabled(true);
    }
};

最初は信じられないほど高速ですが、約 50 個のサムネイルが取得されると遅くなり始めます。サムネイルの取得を高速化するための秘訣を知っている人はいますか?

4

1 に答える 1

1

さて、一部のサムネイルが他のサムネイルよりも速く読み込まれる理由がわかりました。私は使用しています

managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{ MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID }, null, null, MediaStore.Images.Media._ID);

SDカードとデバイスの両方から画像を取得しているようです。当然のことながら、SD カード イメージのサムは、デバイス上のサムよりもはるかに遅くロードされます。それでも、組み込みのギャラリーにはこの問題はないようです。現時点での私の解決策は、SD カード イメージを一度ロードした後、デバイス上のサムネイルを保存することです。

カスタム フォト ギャラリーの実装に関心がある人にとっては、上記のコードがうまく機能するはずです。ご不明な点がございましたら、お気軽にメッセージをお送りください。

于 2011-12-19T16:14:59.470 に答える