簡體   English   中英

為什么我的圖像加載到listView這么慢?

[英]why are my images loaded so slow to the listView?

我有一個帶ImageViews的listView。

我嘗試使用以下代碼壓縮位圖:

    public void getImage(final String urlStr, final ImageView toSet) {
        // set the tag immediately, to prevent delayed image downloads from
        // setting this image.
        toSet.setTag(urlStr);

        getImage(urlStr, new ImageRepository.ImageRepositoryListener() {
            @Override
            public void onImageRetrieved(final Drawable drawable) {
                if (drawable == null)
                    return;
                toSet.post(new Runnable() {
                    @Override
                    public void run() {
                        // make sure the tag is still the one we set at the
                        // beginning of this function
                        if (toSet.getTag() == urlStr) {
                            toSet.setImageDrawable(drawable);
                            drawable.setCallback(null);
                        }
                    }
                });
            }
        });

    }


public class DownloadImageAsyncTask2 extends
            AsyncTask<String, Void, Bitmap> {
        private final ImageView imageView;
        private String imageUrl;

        public DownloadImageAsyncTask2(ImageView imageView) {
            this.imageView = imageView;
        }

        @Override
        protected void onPreExecute() {
            Log.i("DownloadImageAsyncTask", "Starting image download task...");
        }

        @Override
        protected Bitmap doInBackground(String... params) {
            imageUrl = params[0];
            try {

                imageRepository.getImage(imageUrl, imageView);

                return BitmapFactory.decodeStream((InputStream) new URL(
                        imageUrl).getContent());
            } catch (IOException e) {
                Log.e("DownloadImageAsyncTask", "Error reading bitmap" + e);
                downloadingImageUrls.remove(imageUrl);
            }
            return null;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {

            imageCache.put(imageUrl, bitmap);
            downloadingImageUrls.remove(imageUrl);

            if (bitmap != null
                    && ((String) imageView.getTag()).equals(imageUrl)) {
                imageView.setImageBitmap(bitmap);
            }
        }
    }

如何使圖像加載時間更快?

(我曾嘗試在服務器端縮小圖像的大小,但我想考慮在客戶端可以改進的地方)。

我使用異步下載任務來下載圖像,並使用緩存層來保留它們。

這是代碼:

您的圖片加載緩慢是因為:

在將圖像下載並保存到緩存中后,將使用AsyncTask進行加載,但不會立即給出結果。

  • 首先,它由全局線程池控制,並發線程的最大數量。 有時,它在完成另一個AsyncTask之后開始。

  • 其次,方法“ onPostExecute”在主線程中執行,但是在完成主線程的所有其他消息之后。

所以:

  • 僅使用AsyncTask來下載圖像並將其保存在緩存中。

  • 在使用AsyncTask之前,請嘗試檢查緩存中是否存在預期的圖像。 如果存在,則直接在主線程中顯示它。 確保所需圖像的尺寸恰好適合您的圖像視圖。

在您的情況下,添加如下代碼:

public void getImage(final String urlStr, final ImageView toSet) {
    //get the expected image associated with this url and the size of this image view in the cache
    Bitmap bitmap = getExpectedBitmap(urlStr,expectedSize); 
    if(bitmap != null) {
        //if it exists , set it in the image view and finish.
        toSet.setImageBitmap(bitmap);
        return;
    }

    // set the tag immediately, to prevent delayed image downloads from
    // setting this image.
    toSet.setTag(urlStr);

    getImage(urlStr, new ImageRepository.ImageRepositoryListener() {
        @Override
        public void onImageRetrieved(final Drawable drawable) {
            if (drawable == null)
                return;
            toSet.post(new Runnable() {
                @Override
                public void run() {
                    // make sure the tag is still the one we set at the
                    // beginning of this function
                    if (toSet.getTag() == urlStr) {
                        toSet.setImageDrawable(drawable);
                        drawable.setCallback(null);
                    }
                }
            });
        }
    });

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM