package com.android.entity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Handler; import android.os.Message; import android.util.LruCache; import android.widget.ImageView; import android.widget.ListView; import com.android.adapter.NewsAdapter; import com.android.play.R; import java.awt.font.TextAttribute; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.StringReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.HashSet; import java.util.Set; /** * Created by Administrator on 2016/6/7. */ public class ImageLoader { private ImageView mImageView; private String mUrl; //创建Cache 缓存 private LruCache<String, Bitmap> mCaches; private ListView mListView; private Set<NewsAsyncTask> mTask; public ImageLoader(ListView listView){ mListView = listView; mTask = new HashSet<>(); //获取最大可用内存 int maxMemory = (int) Runtime.getRuntime().maxMemory(); int cacheSize = maxMemory/4; /*匿名内部类*/ mCaches = new LruCache<String, Bitmap>(cacheSize){ @Override protected int sizeOf(String key, Bitmap value) { //在每次存入缓存的时候调用 return value.getByteCount(); } }; } //增加到缓存,增加的同时判断是否已经存在 public void addBitmapToCache(String url, Bitmap bitmap){ if (getBitmapFromCache(url) == null){ mCaches.put(url,bitmap); } } //从缓存中获取数据 public Bitmap getBitmapFromCache(String url){ return mCaches.get(url); } private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (mImageView.getTag().equals(mUrl)) { mImageView.setImageBitmap((Bitmap) msg.obj); } } }; public void showImageByThread(ImageView imageView, final String url){ mImageView = imageView; mUrl = url; new Thread(){ @Override public void run() { super.run(); Bitmap bitmap = getBitmapFromURL(url); Message message = Message.obtain(); //使用现有的 回收掉的Message,提高效率 message.obj = bitmap; handler.sendMessage(message); } }.start(); } // 通过一个网络上的url来转换成图片 public Bitmap getBitmapFromURL(String urlString){ Bitmap bitmap; InputStream is = null; try { URL url = new URL(urlString); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); is = new BufferedInputStream(connection.getInputStream()); bitmap = BitmapFactory.decodeStream(is); connection.disconnect(); return bitmap; } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } //通过AsyncTask加载图片 public void showImageByAsyncTask(ImageView imageView, String url){ //从缓存中取出对应图片,如果缓存没有,必须去下载 Bitmap bitmap = getBitmapFromCache(url); if(bitmap == null) { imageView.setImageResource(R.mipmap.ic_launcher); }else { imageView.setImageBitmap(bitmap); } } private class NewsAsyncTask extends AsyncTask<String, Void, Bitmap>{ // private ImageView mImageView; private String mUrl; public NewsAsyncTask(/*ImageView imageView,*/ String url){ // mImageView = imageView; mUrl = url; } @Override protected Bitmap doInBackground(String... params) { //从网络获取图片,下载完毕后将不在缓存中的图片加入缓存 String url = params[0]; Bitmap bitmap = getBitmapFromURL(url); if (bitmap != null){ addBitmapToCache(url, bitmap); } return bitmap; } @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); /* if(mImageView.getTag().equals(mUrl)) { mImageView.setImageBitmap(bitmap); }*/ ImageView imageView = (ImageView) mListView.findViewWithTag(mUrl); if (imageView != null && bitmap != null){ imageView.setImageBitmap(bitmap); } mTask.remove(this); } } //用来加载从start 到end的所有图片 public void loadImages(int start, int end){ for (int i = start; i<end;i++){ String url = NewsAdapter.URLS[i]; Bitmap bitmap = getBitmapFromCache(url); if (bitmap == null){ NewsAsyncTask task = new NewsAsyncTask(url); task.execute(url); mTask.add(task); }else { ImageView imageView = (ImageView) mListView.findViewWithTag(url); imageView.setImageBitmap(bitmap); } } } public void cancelAllTasks(){ if(mTask != null){ for (NewsAsyncTask task : mTask){ task.cancel(false); } } } }