新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > android ListView異步加載圖片

        android ListView異步加載圖片

        作者: 時間:2016-09-12 來源:網絡 收藏

        ListView異步加載圖片是非常實用的方法,凡是是要通過網絡獲取圖片資源一般使用這種方法比較好,用戶體驗好,不用讓用戶等待下去,下面就說實現方法,先貼上主方法的代碼

        本文引用地址:http://www.104case.com/article/201609/305008.htm

        public class AsyncImageLoader {

        private HashMap

        public AsyncImageLoader() {

        imageCache = new HashMap

        }

        public Drawable loadDrawable(final String imageUrl, final ImageCallback imageCallback) {

        if (imageCache.containsKey(imageUrl)) {

        SoftReference softReference = imageCache.get(imageUrl);

        Drawable drawable = softReference.get();

        if (drawable != null) {

        return drawable;

        }

        }

        final Handler handler = new Handler() {

        public void handleMessage(Message message) {

        imageCallback.imageLoaded((Drawable) message.obj, imageUrl);

        }

        };

        new Thread() {

        @Override

        public void run() {

        Drawable drawable = loadImageFromUrl(imageUrl);

        imageCache.put(imageUrl, new SoftReference(drawable));

        Message message = handler.obtainMessage(0, drawable);

        handler.sendMessage(message);

        }

        }.start();

        return null;

        }

        public static Drawable loadImageFromUrl(String url) {

        URL m;

        InputStream i = null;

        try {

        m = new URL(url);

        i = (InputStream) m.getContent();

        } catch (MalformedURLException e1) {

        e1.printStackTrace();

        } catch (IOException e) {

        e.printStackTrace();

        }

        Drawable d = Drawable.createFromStream(i, src);

        return d;

        }

        public interface ImageCallback {

        public void imageLoaded(Drawable imageDrawable, String imageUrl);

        }

        }

        實現方式:通過傳入圖片的網絡地址和一個實現ImageCallback行為的對象,當imageCache存在這個圖片時候,返回這個圖片,當imageCache沒有這個圖片時,實例一個異步線程來下載圖片并同時返回為null,最后在圖片下載完成的時候,調用imageLoaded方法。

        現說說這個類設計的優點吧:1.采用了策略模式;2.使用SoftReference關鍵字

        先說說策略模式,程序里把每次下載圖片完成后所進行的操作封裝成一個ImageCallback抽象類,使系統更靈活,并易于擴展。

        在Java中內存管理,引用分為四大類,強引用HardReference、弱引用WeakReference、軟引用SoftReference和虛引用PhantomReference。它們的區別也很明顯,HardReference對象是即使虛擬機內存吃緊拋出OOM也不會導致這一引用的對象被回收,而WeakReference等更適合于一些數量不多,但體積稍微龐大的對象,在這四個引用中,它是最容易被垃圾回收的,而我們對于顯示類似Android Market中每個應用的App Icon時可以考慮使用SoftReference來解決內存不至于快速回收,同時當內存短缺面臨Java VM崩潰拋出OOM前時,軟引用將會強制回收內存,最后的虛引用一般沒有實際意義,僅僅觀察GC的活動狀態,對于測試比較實用同時必須和ReferenceQueue一起使用。對于一組數據,我們可以通過HashMap的方式來添加一組SoftReference對象來臨時保留一些數據,同時對于需要反復通過網絡獲取的不經常改變的內容,可以通過本地的文件系統或數據庫來存儲緩存。

        最后一句話說的很對,事實上大多數情況也是如此。

        在說說它的用法吧,通常它作為一個adapter的一個變量如:

        class BookAdapter extends ArrayAdapter{

        AsyncImageLoader asyncImageLoader;

        Context mContext;

        BookAdapter(Context context,List data){

        super(context, 0, data);

        asyncImageLoader = new AsyncImageLoader();

        mContext = context;

        }

        @Override

        public View getView(int position, View convertView, ViewGroup parent) {

        ViewCache holder ;

        if(convertView==null){

        LayoutInflater inflate = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        convertView = inflate.inflate(com.slider.cn.R.layout.list_item , null);

        holder = new ViewCache();

        holder.icon = (ImageView)convertView.findViewById(com.slider.cn.R.id.note_icon);

        holder.name = (TextView)convertView.findViewById(com.slider.cn.R.id.note_name);

        holder.date = (TextView)convertView.findViewById(com.slider.cn.R.id.note_date);

        convertView.setTag(holder);

        }else{

        holder = (ViewCache)convertView.getTag();

        }

        final BookInfo bookInfo = getItem(position);

        holder.name.setText(bookInfo.getName().toString());

        holder.date.setText(bookInfo.getInfo());

        holder.icon.setTag(bookInfo.getUri());

        //

        Drawable drawable = asyncImageLoader.loadDrawable(bookInfo.getUri(), new ImageCallback() {

        @Override

        public void imageLoaded(Drawable imageDrawable, String imageUrl) {

        ImageView imageViewByTag = (ImageView) BookListView.this.findViewWithTag(bookInfo.getUri());

        if (imageViewByTag!=null) {

        imageViewByTag.setImageDrawable(imageDrawable);

        }else {

        //load image failed from Internet

        }

        }

        });

        if(drawable==null){

        holder.icon.setImageDrawable(drawable_waiting);


        上一頁 1 2 下一頁

        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 任丘市| 武宣县| 乳源| 长兴县| 卢龙县| 白水县| 洱源县| 黑龙江省| 磴口县| 玉林市| 宁安市| 黔西县| 西贡区| 宿松县| 武城县| 青龙| 界首市| 潼南县| 左云县| 罗源县| 驻马店市| 平江县| 自治县| 黔西县| 宣汉县| 清远市| 宣恩县| 本溪市| 抚顺市| 务川| 广汉市| 阿拉善盟| 伊吾县| 东山县| 霍州市| 涟水县| 高雄市| 深州市| 襄樊市| 东兰县| 新竹市|