基于AsyncTask的ImageLoader网络图片加载

本文介绍了一个基于AsyncTask实现的简单ImageLoader类,用于加载网络图片并缓存到内存。通过LruCache进行缓存管理,并提供了加载图片的方法,支持从缓存获取或从网络下载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

随手写一个基于AsyncTask的ImageLoader网络图片加载r,如下:


import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.util.LruCache;
import android.widget.ImageView;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

/**
 * Created by dhl on 2017/1/15.
 * 基于AsyncTask的ImageLoader网络图片加载
 */

public class ImageLoader {

    //暂时只支持ImageView
    private ImageView imageView ;
    private String url ;

    //缓存,暂时只做内存缓存,不支持硬盘缓存
    private LruCache<String ,Bitmap> lruCache ;
    public ImageLoader()
    {
        int maxMemory = (int)Runtime.getRuntime().maxMemory();
        int cacheSize = maxMemory / 4;
        lruCache = new LruCache<String,Bitmap>(cacheSize)
        {
            @Override
            protected int sizeOf(String key, Bitmap value) {
                int size = value.getByteCount();
                Log.e("ImageLoader","=========="+size) ;
                return size;
            }
        };
    }

    /**
     * 依据url把bitmap添加到缓存
     * @param url key
     * @param bitmap value
     */
    public void addBitmapToCache(String url ,Bitmap bitmap)
    {
        if(getBitmapFromCache(url)==null)
        {
            lruCache.put(url,bitmap);
        }
    }

    /**
     * 从缓存中获取Bitmap
     * @param url
     * @return
     */
    public Bitmap getBitmapFromCache(String url)
    {
        return lruCache.get(url);
    }

    /**
     * 从网络获取图片,返回Bitmap
     * @param urlString
     * @return
     */
    public Bitmap getBitmapFromUrl(String urlString)
    {
        Bitmap bitmap ;
        InputStream is = null;
        try {
            is = new URL(urlString).openStream();
            bitmap = BitmapFactory.decodeStream(is);
            return bitmap ;
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return null ;

    }

    /**
     * 若该图片存在缓存直接展示,否则下载图片
     * @param imageView
     * @param imageUrl
     */
    public void showImageByAysncTask(ImageView imageView ,final String imageUrl)
    {

        Bitmap bitmap = getBitmapFromCache(imageUrl);
        if(bitmap == null) {
            new NewsAsyncTask(imageView).execute(imageUrl);
        }else
        {
            imageView.setImageBitmap(bitmap);
        }
    }

    /**
     * 下载图片并添加到缓存中,以及展示
     */
    private class NewsAsyncTask extends AsyncTask<String,Void ,Bitmap>
    {

        private ImageView imageView ;
        private String imageUrl ;
        public NewsAsyncTask(ImageView imageView)
        {
            this.imageView = imageView ;
        }
        @Override
        protected Bitmap doInBackground(String... strings) {
            imageUrl = strings[0];
            Bitmap bitmap = getBitmapFromUrl(strings[0]);
            if(bitmap != null)
            {
                addBitmapToCache(strings[0],bitmap);
            }
            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            if(imageUrl.equals(imageView.getTag()))
            this.imageView.setImageBitmap(bitmap);
        }
    }

}

网络加载图片的原理大同小异,无非是开启线程下载图片并放到适应的位置,写个小Demo,练练手。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值