Android網絡圖片加載優化

網絡圖片加載優化

比如使用淘寶瀏覽產品的時候(大部分應用也是如此),就會發現每次下拉產品目錄進行更新的時候,都會出現對應的Item的時候,纔開始從網絡下載並加載圖片。
taobao加載
這裏寫圖片描述

可以看到寶貝圖片下拉刷新的時候,圖片加載是實時從網絡下載的。即使在Wifi的網絡環境下,加載圖片也是有比較大的延遲。

假設我們瀏覽每屏寶貝需要2s的時間(人眼對於淘寶搜索的寶貝其實過濾速度非常快)。如果每一屏頁面需要1s纔可以完全加載完圖片,則如果瀏覽10屏的寶貝,就會需要30s。如果加載圖片幾乎不需要時間,則只需要20s。這個節約比例是很大的。如果不是使用wifi而是移動網絡,則加載時間可能會更長。這種情況不單單是淘寶,很多帶有圖片的app都會出現這種圖片需要很久加載的情況。

而解決這種問題的思路其實很簡單也很直觀,那就是在wifi或者用戶打開設置的情況下,提前加載一屏的圖片,保存在本地硬盤(不是內存)。如果瀏覽到時則從本地加載。

加載的優化基於上一篇文章:
使用Android-Universal-Image-Loader加載網絡圖片
http://blog.csdn.net/chen52671/article/details/44680765

使用Android-Universal-Image-Loader是爲了簡化這個例子,如果你有更好地網絡圖片下載和內存緩存,硬盤緩存的工具,道理是一樣的。

實現思路:
1,判斷網絡環境是否爲WiFi。
2,如果是則開啓預緩存,當在Page1時,下載Page2的圖片到本地;下拉到paga2時,圖片直接從本地讀取到內存並顯示,同時下載Page3到本地。以此類推

讓Android-Universal-Image-Loader只下載

ImageLoader主要使用displayImage來加載某URI的圖片到ImageView。還有個方法是loadImage()——用來異步加載圖片:其也是通過調用displayImage來操作的,不過傳遞進去的imageAware(可以當ImageView理解)是一個空實現,當Bitmap加載完畢後,返回一個回調。
但是都沒法滿足我們的要求:圖片流只下載至本地硬盤緩存,但是不解析成Bitmap。更不要提將解析好的Bitmap加載到內存緩存中。
借用一張ImageLoader的displayImage流程圖:

display-image-flow-chart
圖片來自Android Universal Image Loader 源碼分析
這裏寫圖片描述

爲了實現只下載,不加載。需要對Android-Universal-Image-Loader做一下變動(對不住了~~)
1,ImageLoader類添加一個downloadImage方法,和displayImage類似,同樣要遵循已有的配置,也要判斷是不是在本地硬盤緩存已經有該圖片。
2,如果DisplayImageOptions根本就沒配置cacheOnDisk,那就對不住了,不下載。

修改如下:

增加一個DownloadTask

package com.nostra13.universalimageloader.core;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.ReentrantLock;


import android.os.Handler;
import android.util.Log;

import com.nostra13.universalimageloader.core.decode.ImageDecoder;
import com.nostra13.universalimageloader.core.download.ImageDownloader;

import com.nostra13.universalimageloader.core.listener.DownloadListener;

import com.nostra13.universalimageloader.utils.IoUtils;

public class DownloadTask implements Runnable, IoUtils.CopyListener {
    private String Tag = "DownloadTask";
    private final ImageLoaderEngine engine;
    private final ImageDownloadInfo imageDownloadInfo;
    private final Handler handler;
    // Helper references
    private final ImageLoaderConfiguration configuration;
    private final ImageDownloader downloader;
    private final ImageDownloader networkDeniedDownloader;
    private final ImageDownloader slowNetworkDownloader;
    private final ImageDecoder decoder;
    final DownloadListener listener;
    final String uri;

    final DisplayImageOptions options;

    private final boolean syncLoading;

    public DownloadTask(ImageLoaderEngine engine,
            ImageDownloadInfo imageDownloadInfo, Handler handler) {
        this.engine = engine;
        this.imageDownloadInfo = imageDownloadInfo;
        this.handler = handler;

        configuration = engine.configuration;
        downloader = configuration.downloader;
        networkDeniedDownloader = configuration.networkDeniedDownloader;
        slowNetworkDownloader = configuration.slowNetworkDownloader;
        decoder = configuration.decoder;
        uri = imageDownloadInfo.uri;
        listener = imageDownloadInfo.listener;
        options = imageDownloadInfo.options;
        syncLoading = options.isSyncLoading();
    }

    @Override
    public void run() {
        if (waitIfPaused())
            return;

        ReentrantLock downloadLock = engine.getLockForUri(uri);

        if (downloadLock.isLocked()) {
            Log.d(Tag, "locked");
        }

        downloadLock.lock();
        try {
            File imageFile = configuration.diskCache.get(uri);
            if (imageFile != null && imageFile.exists()
                    && imageFile.length() > 0) {
                return;// 文件存在,不用忙活了
            }
            if (options.isCacheOnDisk()) {
                if(tryCacheImageOnDisk()){
                    listener.onDownloadComplete(uri);
                }
            }
            checkTaskInterrupted();
        } catch (TaskCancelledException e) {
            fireCancelEvent();
            return;
        } finally {
            downloadLock.unlock();
        }

    }

    private boolean waitIfPaused() {
        AtomicBoolean pause = engine.getPause();
        if (pause.get()) {
            synchronized (engine.getPauseLock()) {
                if (pause.get()) {
                    try {
                        engine.getPauseLock().wait();
                    } catch (InterruptedException e) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    String getLoadingUri() {
        return uri;
    }

    private void checkTaskInterrupted() throws TaskCancelledException {
        if (isTaskInterrupted()) {
            throw new TaskCancelledException();
        }
    }

    /**
     * @return <b>true</b> - if current task was interrupted; <b>false</b> -
     *         otherwise
     */
    private boolean isTaskInterrupted() {
        if (Thread.interrupted()) {
            Log.d(Tag, "Thread interrupted");
            return true;
        }
        return false;
    }

    static void runTask(Runnable r, boolean sync, Handler handler,
            ImageLoaderEngine engine) {
        if (sync) {
            r.run();
        } else if (handler == null) {
            engine.fireCallback(r);
        } else {
            handler.post(r);
        }
    }

    private void fireCancelEvent() {
        if (syncLoading || isTaskInterrupted())
            return;
        Runnable r = new Runnable() {
            @Override
            public void run() {
                listener.onDownloadCancelled(uri);
            }
        };
        runTask(r, false, handler, engine);
    }

    private boolean tryCacheImageOnDisk() throws TaskCancelledException {

        boolean loaded;
        try {
            loaded = downloadImage();
            // 暫時不resize
        } catch (IOException e) {
            loaded = false;
        }
        return loaded;
    }

    private boolean downloadImage() throws IOException {
        InputStream is = getDownloader().getStream(uri,
                options.getExtraForDownloader());
        if (is == null) {

            return false;
        } else {
            try {
                return configuration.diskCache.save(uri, is, this);
            } finally {
                IoUtils.closeSilently(is);
            }
        }
    }

    private ImageDownloader getDownloader() {
        ImageDownloader d;
        if (engine.isNetworkDenied()) {
            d = networkDeniedDownloader;
        } else if (engine.isSlowNetwork()) {
            d = slowNetworkDownloader;
        } else {
            d = downloader;
        }
        return d;
    }

    class TaskCancelledException extends Exception {
    }

    @Override
    public boolean onBytesCopied(int current, int total) {
        // TODO Auto-generated method stub
        return true;
    }
}

增加一個ImageDownloadInfo

package com.nostra13.universalimageloader.core;

import java.util.concurrent.locks.ReentrantLock;

import com.nostra13.universalimageloader.core.listener.DownloadListener;

public class ImageDownloadInfo {

    final String uri;
    final DownloadListener listener;
    final DisplayImageOptions options;

    final ReentrantLock downloadLock;

    public ImageDownloadInfo(String uri ,DisplayImageOptions options,DownloadListener listener,
            ReentrantLock downloadLock) {
        this.uri = uri;
        this.listener=listener;
        this.options = options;
        this.downloadLock = downloadLock;

    }
}

增加一個DownloadListener監聽器

package com.nostra13.universalimageloader.core.listener;

public interface  DownloadListener{
    void OnDownloadStart(String imageUri);

    void onDownloadFailed(String imageUri);

    void onDownloadComplete(String imageUri);

    void onDownloadCancelled(String imageUri);
}

ImageLoader修改

/*
     * 
     * @param uri Image URI (i.e. "http://site.com/image.png",
     * "file:///mnt/sdcard/image.png")
     * 
     * @param listener 圖片下載的監聽器
     */
    public void downloadImage(String uri, DisplayImageOptions options,
            DownloadListener listener) {
        checkConfiguration();
        if (listener == null) {
            listener = new DownloadListener() {
                @Override
                public void onDownloadFailed(String imageUri) {
                }

                @Override
                public void onDownloadComplete(String imageUri) {
                }

                @Override
                public void onDownloadCancelled(String imageUri) {
                }

                @Override
                public void OnDownloadStart(String imageUri) {

                }
            };
        }
        if (options == null) {
            options = configuration.defaultDisplayImageOptions;
        }
        if(!options.isCacheOnDisk()) return;
        listener.OnDownloadStart(uri);
        if (TextUtils.isEmpty(uri)) {
            listener.onDownloadFailed(uri);
            return;
        }

        ImageDownloadInfo imageDownloadInfo = new ImageDownloadInfo(uri,options,listener,engine.getLockForUri(uri));
        DownloadTask downloadTask = new DownloadTask(
                engine, imageDownloadInfo,defineHandler(options));
        if (options.isSyncLoading()) {
            downloadTask.run();
        } else {
            engine.submit(downloadTask);
        }

    }

ImageLoaderEngine中添加了一個submit方法

    //for downLoad tast
    void submit(final DownloadTask task) {
        taskDistributor.execute(new Runnable() {
            @Override
            public void run() {
                File image = configuration.diskCache.get(task.getLoadingUri());
                boolean isImageCachedOnDisk = image != null && image.exists();
                initExecutorsIfNeed();
                if (isImageCachedOnDisk) {
                    //do nothing.casue we have the image files already!
                } else {
                    taskExecutor.execute(task);
                }
            }
        });
    }

由於實現的比較倉促,還有很多細節問題需要實現:
1,沒有實現比如文件保存時沒有resize圖片大小。
2,還有如果剛剛添加了圖片下載任務,這時候下拉刷新,就會圖片就會增加一個加載並顯示的任務,這時如果下載任務沒完成,應該是取消下載任務(cancelDownloadTask),進行圖片顯示任務。更完善一點的是等待圖片下載任務完成,再進行加載任務。這些細節就沒有考慮了,所以進行時可能會有些問題。

優化

這個工程是基於上一篇文章的基礎上修改優化的。http://blog.csdn.net/chen52671/article/details/44680765
原效果圖如下:

ImageLoader加載

優化前

這裏寫圖片描述
可以看出一個Page大概加載15張圖片。如果是每個Item的getView時,觸發item position+15的那個Item的圖片的下載任務即可。

該效果圖是對taobao加載寶貝圖片的一個還原,可以看到起滑動刷新的時候,圖片也是需要聯網下載並加載,同樣存在一定的延遲效果。

優化後:

優化後的ImageLoader加載
這裏寫圖片描述

效果圖看出,圖片翻頁時的加載速度明顯提升,並且由於是直接緩存在本地硬盤,不會造成明顯的內存佔用,從一定程度上解決了翻頁時的網絡圖片加載緩慢問題

優化修改主要在MyAdapter類。使用的ImageLoader是前面修改的版本。

MyAdapter

package com.example.gridpic;

import java.util.List;

import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.listener.DownloadListener;

import android.content.Context;
import android.graphics.Bitmap;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import android.widget.BaseAdapter;
import android.widget.ImageView;

public class MyAdapter extends BaseAdapter {
    List<String> imageList;
    protected ImageLoader imageLoader = ImageLoader.getInstance();
    protected DisplayImageOptions options;
    private LayoutInflater mInflater;
    public Context context;

    public MyAdapter(Context context, List<String> imageList) {
        super();
        this.imageList = imageList;
        this.context = context;
        options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.drawable.ic_launcher)
                .showImageForEmptyUri(R.drawable.ic_launcher)
                .showImageOnFail(R.drawable.ic_launcher).cacheInMemory(true)
                .cacheOnDisk(true).bitmapConfig(Bitmap.Config.RGB_565).build();

        this.mInflater = LayoutInflater.from(context);
        // 初始化ImageLoader
        ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(
                context);
        config.threadPriority(Thread.NORM_PRIORITY - 2);
        config.denyCacheImageMultipleSizesInMemory();
        config.diskCacheFileNameGenerator(new Md5FileNameGenerator());
        config.diskCacheSize(50 * 1024 * 1024); // 50 MiB
        config.tasksProcessingOrder(QueueProcessingType.LIFO);
        config.writeDebugLogs(); // Remove for release app
        ImageLoader.getInstance().init(config.build());
    }

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

    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int position, View view, ViewGroup viewGroup) {
        ViewHolder holder = null;
        if (view == null) {
            view = mInflater.inflate(R.layout.picitem, null);
            holder = new ViewHolder();
            holder.image = (ImageView) view.findViewById(R.id.imageView1);
            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }
        imageLoader
                .displayImage(imageList.get(position), holder.image, options);
        //判斷如果是Wifi環境,則採用Disc預加載策略
        if (isWifi()) {
            final int cachePosition = Math.min(position + 15,
                    imageList.size() - 1);
            imageLoader.downloadImage(imageList.get(cachePosition), options,
                    new DownloadListener() {

                        @Override
                        public void onDownloadFailed(String arg0) {
                        }

                        @Override
                        public void onDownloadComplete(String arg0) {
                            Log.e("whatever", "Cache Image:" + cachePosition
                                    + ". url=" + imageList.get(cachePosition));
                        }

                        @Override
                        public void onDownloadCancelled(String arg0) {
                        }

                        @Override
                        public void OnDownloadStart(String arg0) {

                        }
                    });
        }

        Log.e("whatever",
                "Get Image:" + position + ". url=" + imageList.get(position));
        return view;
    }

    public boolean isWifi() {
        ConnectivityManager connectivityManager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
        if (activeNetInfo != null
                && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) {
            return true;
        }
        return false;
    }

    final class ViewHolder {

        public ImageView image;

    }

}

加載圖片的Log

從log中也能看出圖片加載時的策略能夠看出,圖片的加載,下載的確是按照之前設想的思路進行的。

03-28 19:48:13.300: E/whatever(5315): http://www.juzimi.com/meitumeiju?page=1
03-28 19:48:14.220: E/whatever(5315): http://www.juzimi.com/meitumeiju?page=2
03-28 19:48:14.860: E/whatever(5315): http://www.juzimi.com/meitumeiju?page=3
03-28 19:48:15.640: E/whatever(5315): http://www.juzimi.com/meitumeiju?page=4
03-28 19:48:17.390: E/whatever(5315): http://www.juzimi.com/meitumeiju?page=5
03-28 19:48:17.880: E/whatever(5315): http://www.juzimi.com/meitumeiju?page=6
03-28 19:48:18.640: E/whatever(5315): http://www.juzimi.com/meitumeiju?page=7
03-28 19:48:19.170: E/whatever(5315): http://www.juzimi.com/meitumeiju?page=8
03-28 19:48:20.500: E/whatever(5315): http://www.juzimi.com/meitumeiju?page=9
03-28 19:48:21.060: E/whatever(5315): URL ready
03-28 19:48:21.160: E/libEGL(5315): call to OpenGL ES API with no current context (logged once per thread)
03-28 19:48:21.160: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:21.170: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:21.170: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:21.170: E/whatever(5315): Get Image:1. url=http://file.juzimi.com/weibopic/jizxmd1.jpg
03-28 19:48:21.180: E/whatever(5315): Get Image:2. url=http://file.juzimi.com/weibopic/jrzdmd7.jpg
03-28 19:48:21.180: E/whatever(5315): Get Image:3. url=http://file.juzimi.com/weibopic/jozome2.jpg
03-28 19:48:21.180: E/whatever(5315): Get Image:4. url=http://file.juzimi.com/weibopic/jpzlmu7.jpg
03-28 19:48:21.180: E/whatever(5315): Get Image:5. url=http://file.juzimi.com/weibopic/jezimr6.jpg
03-28 19:48:21.190: E/whatever(5315): Get Image:6. url=http://file.juzimi.com/weibopic/jezemp2.jpg
03-28 19:48:21.190: E/whatever(5315): Get Image:7. url=http://file.juzimi.com/weibopic/jrzlmx2.jpg
03-28 19:48:21.190: E/whatever(5315): Get Image:8. url=http://file.juzimi.com/weibopic/jrzomd2.jpg
03-28 19:48:21.190: E/whatever(5315): Get Image:9. url=http://file.juzimi.com/weibopic/jizpml4.jpg
03-28 19:48:21.200: E/whatever(5315): Get Image:10. url=http://file.juzimi.com/weibopic/jezlmd1.jpg
03-28 19:48:21.200: E/whatever(5315): Get Image:11. url=http://file.juzimi.com/weibopic/jiziml3.jpg
03-28 19:48:21.200: E/whatever(5315): Get Image:12. url=http://file.juzimi.com/weibopic/jlzdmd3.jpg
03-28 19:48:21.200: E/whatever(5315): Get Image:13. url=http://file.juzimi.com/weibopic/jxzlmu2.jpg
03-28 19:48:21.210: E/whatever(5315): Get Image:14. url=http://file.juzimi.com/weibopic/jdzpmx2.jpg
03-28 19:48:22.090: E/whatever(5315): Cache Image:15. url=http://file.juzimi.com/weibopic/jezpma2.jpg
03-28 19:48:22.300: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:22.300: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:22.350: E/whatever(5315): Cache Image:29. url=http://file.juzimi.com/weibopic/juzlma7.jpg
03-28 19:48:22.440: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:22.440: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:23.120: E/whatever(5315): Cache Image:28. url=http://file.juzimi.com/weibopic/jpzoma2.jpg
03-28 19:48:23.370: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:23.380: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:23.790: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:23.790: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:23.890: E/whatever(5315): Cache Image:27. url=http://file.juzimi.com/weibopic/jazlml6.jpg
03-28 19:48:23.990: E/whatever(5315): Cache Image:26. url=http://file.juzimi.com/weibopic/jpzdmr2.jpg
03-28 19:48:24.270: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:24.270: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:24.270: E/whatever(5315): Cache Image:25. url=http://file.juzimi.com/weibopic/jezrmu5.jpg
03-28 19:48:24.500: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:24.510: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:24.600: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:24.610: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:24.770: E/whatever(5315): Cache Image:23. url=http://file.juzimi.com/weibopic/jazxmr4.jpg
03-28 19:48:25.510: E/whatever(5315): Cache Image:22. url=http://file.juzimi.com/weibopic/jozdme6.jpg
03-28 19:48:25.560: E/whatever(5315): Cache Image:24. url=http://file.juzimi.com/weibopic/jlzamd7.jpg
03-28 19:48:26.300: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:26.300: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:26.410: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:26.410: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:26.440: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:26.440: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:26.500: E/whatever(5315): Cache Image:20. url=http://file.juzimi.com/weibopic/juzdmd7.jpg
03-28 19:48:27.780: E/whatever(5315): Cache Image:21. url=http://file.juzimi.com/weibopic/jizdma2.jpg
03-28 19:48:28.030: E/whatever(5315): Cache Image:19. url=http://file.juzimi.com/weibopic/jizoma3.jpg
03-28 19:48:28.420: E/whatever(5315): Cache Image:18. url=http://file.juzimi.com/weibopic/juzlmx.jpg
03-28 19:48:28.420: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:28.420: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:28.800: E/whatever(5315): Cache Image:17. url=http://file.juzimi.com/weibopic/jpzxmr5.jpg
03-28 19:48:28.870: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:28.870: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:29.520: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:29.520: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:29.790: E/whatever(5315): Cache Image:16. url=http://file.juzimi.com/weibopic/jrzlmp2.jpg
03-28 19:48:30.390: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:30.390: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:30.490: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:30.490: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:32.540: E/whatever(5315): Get Image:15. url=http://file.juzimi.com/weibopic/jezpma2.jpg
03-28 19:48:32.540: E/whatever(5315): Get Image:16. url=http://file.juzimi.com/weibopic/jrzlmp2.jpg
03-28 19:48:32.550: E/whatever(5315): Get Image:17. url=http://file.juzimi.com/weibopic/jpzxmr5.jpg
03-28 19:48:32.640: E/whatever(5315): Get Image:18. url=http://file.juzimi.com/weibopic/juzlmx.jpg
03-28 19:48:32.640: E/whatever(5315): Get Image:19. url=http://file.juzimi.com/weibopic/jizoma3.jpg
03-28 19:48:32.650: E/whatever(5315): Get Image:20. url=http://file.juzimi.com/weibopic/juzdmd7.jpg
03-28 19:48:32.650: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:32.680: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:32.740: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:32.740: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:32.750: E/whatever(5315): Get Image:21. url=http://file.juzimi.com/weibopic/jizdma2.jpg
03-28 19:48:32.750: E/whatever(5315): Get Image:22. url=http://file.juzimi.com/weibopic/jozdme6.jpg
03-28 19:48:32.760: E/whatever(5315): Get Image:23. url=http://file.juzimi.com/weibopic/jazxmr4.jpg
03-28 19:48:32.760: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:32.760: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:32.890: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:32.900: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:33.280: E/whatever(5315): Cache Image:32. url=http://file.juzimi.com/weibopic/jpzrmp2.jpg
03-28 19:48:33.640: E/whatever(5315): Cache Image:31. url=http://file.juzimi.com/weibopic/jizomd2.jpg
03-28 19:48:34.080: E/whatever(5315): Cache Image:37. url=http://file.juzimi.com/weibopic/jazlmu4.jpg
03-28 19:48:34.100: E/whatever(5315): Cache Image:30. url=http://file.juzimi.com/weibopic/jxzimu1.jpg
03-28 19:48:34.110: E/whatever(5315): Get Image:24. url=http://file.juzimi.com/weibopic/jlzamd7.jpg
03-28 19:48:34.110: E/whatever(5315): Get Image:25. url=http://file.juzimi.com/weibopic/jezrmu5.jpg
03-28 19:48:34.110: E/whatever(5315): Get Image:26. url=http://file.juzimi.com/weibopic/jpzdmr2.jpg
03-28 19:48:34.190: E/whatever(5315): Get Image:27. url=http://file.juzimi.com/weibopic/jazlml6.jpg
03-28 19:48:34.190: E/whatever(5315): Get Image:28. url=http://file.juzimi.com/weibopic/jpzoma2.jpg
03-28 19:48:34.200: E/whatever(5315): Get Image:29. url=http://file.juzimi.com/weibopic/juzlma7.jpg
03-28 19:48:34.260: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:34.290: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:34.300: E/whatever(5315): Cache Image:38. url=http://file.juzimi.com/weibopic/jpzrmr5.jpg
03-28 19:48:34.300: E/whatever(5315): Cache Image:36. url=http://file.juzimi.com/weibopic/juzpma3.jpg
03-28 19:48:34.310: E/whatever(5315): Get Image:30. url=http://file.juzimi.com/weibopic/jxzimu1.jpg
03-28 19:48:34.310: E/whatever(5315): Get Image:31. url=http://file.juzimi.com/weibopic/jizomd2.jpg
03-28 19:48:34.310: E/whatever(5315): Get Image:32. url=http://file.juzimi.com/weibopic/jpzrmp2.jpg
03-28 19:48:34.320: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:34.320: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:34.400: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:34.430: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:34.440: E/whatever(5315): Cache Image:35. url=http://file.juzimi.com/weibopic/jozdmx.jpg
03-28 19:48:34.450: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:34.450: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:34.480: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:34.480: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:34.480: E/whatever(5315): Cache Image:43. url=http://file.juzimi.com/weibopic/juzpml2.jpg
03-28 19:48:34.930: E/whatever(5315): Cache Image:46. url=http://file.juzimi.com/weibopic/jpzomr5.jpg
03-28 19:48:35.090: E/whatever(5315): Cache Image:44. url=http://file.juzimi.com/weibopic/jozxml1.jpg
03-28 19:48:35.530: E/whatever(5315): Cache Image:47. url=http://file.juzimi.com/weibopic/jozamp7.jpg
03-28 19:48:35.550: E/whatever(5315): Get Image:33. url=http://file.juzimi.com/weibopic/jpzomr.jpg
03-28 19:48:35.560: E/whatever(5315): Get Image:34. url=http://file.juzimi.com/weibopic/juzomr5.jpg
03-28 19:48:35.560: E/whatever(5315): Get Image:35. url=http://file.juzimi.com/weibopic/jozdmx.jpg
03-28 19:48:35.610: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:35.620: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:35.640: E/whatever(5315): Get Image:36. url=http://file.juzimi.com/weibopic/juzpma3.jpg
03-28 19:48:35.640: E/whatever(5315): Get Image:37. url=http://file.juzimi.com/weibopic/jazlmu4.jpg
03-28 19:48:35.640: E/whatever(5315): Get Image:38. url=http://file.juzimi.com/weibopic/jpzrmr5.jpg
03-28 19:48:35.720: E/whatever(5315): Get Image:39. url=http://file.juzimi.com/weibopic/jxzlmx5.jpg
03-28 19:48:35.720: E/whatever(5315): Get Image:40. url=http://file.juzimi.com/weibopic/jezlmo3.jpg
03-28 19:48:35.720: E/whatever(5315): Get Image:41. url=http://file.juzimi.com/weibopic/jozeml6.jpg
03-28 19:48:35.740: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:35.740: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:35.790: E/whatever(5315): Get Image:42. url=http://file.juzimi.com/weibopic/jlzomi.jpg
03-28 19:48:35.800: E/whatever(5315): Get Image:43. url=http://file.juzimi.com/weibopic/juzpml2.jpg
03-28 19:48:35.800: E/whatever(5315): Get Image:44. url=http://file.juzimi.com/weibopic/jozxml1.jpg
03-28 19:48:35.830: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:35.830: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:35.880: E/whatever(5315): Cache Image:45. url=http://file.juzimi.com/weibopic/jdzama3.jpg
03-28 19:48:35.890: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:35.890: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:35.910: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:35.910: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:36.120: E/whatever(5315): Cache Image:42. url=http://file.juzimi.com/weibopic/jlzomi.jpg
03-28 19:48:36.180: E/whatever(5315): Cache Image:59. url=http://file.juzimi.com/weibopic/juzxmo7.jpg
03-28 19:48:36.230: E/whatever(5315): Cache Image:41. url=http://file.juzimi.com/weibopic/jozeml6.jpg
03-28 19:48:36.320: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:36.320: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:36.490: E/whatever(5315): Cache Image:58. url=http://file.juzimi.com/weibopic/jrzome.jpg
03-28 19:48:36.810: E/whatever(5315): Cache Image:57. url=http://file.juzimi.com/weibopic/jxzomr3.jpg
03-28 19:48:36.910: E/whatever(5315): Cache Image:54. url=http://file.juzimi.com/weibopic/jizemr.jpg
03-28 19:48:36.940: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:36.940: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:36.970: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:36.970: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:37.170: E/whatever(5315): Cache Image:56. url=http://file.juzimi.com/weibopic/jezomx5.jpg
03-28 19:48:37.240: E/whatever(5315): Cache Image:55. url=http://file.juzimi.com/weibopic/jezdmu7.jpg
03-28 19:48:37.600: E/whatever(5315): Cache Image:53. url=http://file.juzimi.com/weibopic/jrzomr3.jpg
03-28 19:48:37.890: E/whatever(5315): Cache Image:52. url=http://file.juzimi.com/weibopic/jozomr7.jpg
03-28 19:48:38.560: E/whatever(5315): Cache Image:51. url=http://file.juzimi.com/weibopic/jozume4.jpg
03-28 19:48:38.590: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:38.590: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:38.870: E/whatever(5315): Cache Image:50. url=http://file.juzimi.com/weibopic/jazrmp6.jpg
03-28 19:48:38.900: E/whatever(5315): Cache Image:49. url=http://file.juzimi.com/weibopic/jrzumi2.jpg
03-28 19:48:38.970: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:38.970: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:39.120: E/whatever(5315): Cache Image:48. url=http://file.juzimi.com/weibopic/jizeme7.jpg
03-28 19:48:39.140: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:39.140: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:40.150: E/whatever(5315): Get Image:45. url=http://file.juzimi.com/weibopic/jdzama3.jpg
03-28 19:48:40.160: E/whatever(5315): Get Image:46. url=http://file.juzimi.com/weibopic/jpzomr5.jpg
03-28 19:48:40.160: E/whatever(5315): Get Image:47. url=http://file.juzimi.com/weibopic/jozamp7.jpg
03-28 19:48:40.250: E/whatever(5315): Get Image:48. url=http://file.juzimi.com/weibopic/jizeme7.jpg
03-28 19:48:40.260: E/whatever(5315): Get Image:49. url=http://file.juzimi.com/weibopic/jrzumi2.jpg
03-28 19:48:40.260: E/whatever(5315): Get Image:50. url=http://file.juzimi.com/weibopic/jazrmp6.jpg
03-28 19:48:40.330: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:40.330: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:40.380: E/whatever(5315): Get Image:51. url=http://file.juzimi.com/weibopic/jozume4.jpg
03-28 19:48:40.380: E/whatever(5315): Get Image:52. url=http://file.juzimi.com/weibopic/jozomr7.jpg
03-28 19:48:40.380: E/whatever(5315): Get Image:53. url=http://file.juzimi.com/weibopic/jrzomr3.jpg
03-28 19:48:40.390: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:40.390: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:40.450: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:40.460: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:40.460: E/whatever(5315): Cache Image:61. url=http://file.juzimi.com/weibopic/jezema5.jpg
03-28 19:48:40.520: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:40.520: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:41.150: E/whatever(5315): Cache Image:68. url=http://file.juzimi.com/weibopic/jlzoml.jpg
03-28 19:48:41.180: E/whatever(5315): Cache Image:60. url=http://file.juzimi.com/weibopic/juzxmi4.jpg
03-28 19:48:41.540: E/whatever(5315): Get Image:54. url=http://file.juzimi.com/weibopic/jizemr.jpg
03-28 19:48:41.540: E/whatever(5315): Get Image:55. url=http://file.juzimi.com/weibopic/jezdmu7.jpg
03-28 19:48:41.540: E/whatever(5315): Get Image:56. url=http://file.juzimi.com/weibopic/jezomx5.jpg
03-28 19:48:41.590: E/whatever(5315): Get Image:57. url=http://file.juzimi.com/weibopic/jxzomr3.jpg
03-28 19:48:41.590: E/whatever(5315): Get Image:58. url=http://file.juzimi.com/weibopic/jrzome.jpg
03-28 19:48:41.600: E/whatever(5315): Get Image:59. url=http://file.juzimi.com/weibopic/juzxmo7.jpg
03-28 19:48:41.600: E/whatever(5315): Cache Image:66. url=http://file.juzimi.com/weibopic/jezumu3.jpg
03-28 19:48:41.640: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:41.640: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:41.720: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:41.720: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:41.740: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:41.740: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:41.760: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:41.760: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:42.670: E/whatever(5315): Cache Image:73. url=http://file.juzimi.com/weibopic/jazxmd6.jpg
03-28 19:48:42.770: E/whatever(5315): Get Image:60. url=http://file.juzimi.com/weibopic/juzxmi4.jpg
03-28 19:48:42.770: E/whatever(5315): Get Image:61. url=http://file.juzimi.com/weibopic/jezema5.jpg
03-28 19:48:42.770: E/whatever(5315): Cache Image:62. url=http://file.juzimi.com/weibopic/jlzrmd4.jpg
03-28 19:48:42.780: E/whatever(5315): Get Image:62. url=http://file.juzimi.com/weibopic/jlzrmd4.jpg
03-28 19:48:42.860: E/whatever(5315): Get Image:63. url=http://file.juzimi.com/weibopic/jxzomo6.jpg
03-28 19:48:42.860: E/whatever(5315): Get Image:64. url=http://file.juzimi.com/weibopic/juzpmi.jpg
03-28 19:48:42.860: E/whatever(5315): Get Image:65. url=http://file.juzimi.com/weibopic/jizemx1.jpg
03-28 19:48:42.880: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:42.880: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:42.880: E/whatever(5315): Cache Image:67. url=http://file.juzimi.com/weibopic/jrzumi7.jpg
03-28 19:48:42.900: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:42.900: E/whatever(5315): Get Image:0. url=http://file.juzimi.com/weibopic/jlzumo3.jpg
03-28 19:48:42.940: E/whatever(5315): Get Image:66. url=http://file.juzimi.com/weibopic/jezumu3.jpg
03-28 19:48:42.940: E/whatever(5315): Get Image:67. url=http://file.juzimi.com/weibopic/jrzumi7.jpg
03-28 19:48:42.940: E/whatever(5315): Get Image:68. url=http://file.juzimi.com/weibopic/jlzoml.jpg

後記

根據效果圖可以看出,在瀏覽時停留幾秒,然後滑動頁面,加載速度的確會快了些。不過除了上面說到的ImageLoader存在的問題外。圖片加載時還存在如下細節問題:

1,Page1的15張圖片加載時,同時第16-30張圖片也會加入到下載隊列,這就造成了第一頁的15張圖片加載緩慢。
解決方法:方法1:修改ImageLoader讓下載任務的優先級降低。方法2:在工程中當前顯示的圖片任務都顯示完畢後,在完成的回調中再加入下載任務。
2,當圖片滑動過快的時候,比如從第1頁,直接滑到了第5頁,那234頁在工程中還是要一步步的下載。而爲了用戶體驗更好,那234頁是沒必要下載,或者最晚下載的。能想到的比較好的方法就是,顯示到哪些item了,那就計算出之前的哪些item已經不在屏幕內了,然後cancel掉下載的任務。或者改變那些下載任務的優先級。
3, 不論是圖片顯示,還是圖片下載,添加任務的時候是按照圖片順序添加的,完成卻是按照逆序完成的。原因是Imageloader設定成了tasksProcessingOrder(QueueProcessingType.LIFO),不過不影響實際效果,根據項目需求設定吧。


以上爲拋磚引玉,僅供參考 , 歡迎討論。

發佈了88 篇原創文章 · 獲贊 5 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章