随手写一个基于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,练练手。