联网加载图片,一个很原始,很古老的办法

简介: 联网加载图片,一个很原始,很古老的办法
加载图片的工具类
package com.android1.news.common;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.ref.SoftReference;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
 
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.v4.util.LruCache;
 
public class LoadImage {  
  //private static Map<String, SoftReference<Bitmap>> softReferences=new HashMap<String, SoftReference<Bitmap>>();
  private static LruCache<String, Bitmap> cache=new LruCache<String, Bitmap>(1024*1024*3);
  
  private Context context;
  private ImageLoadListener listener;
  public LoadImage(Context context,ImageLoadListener listener){
    this.context=context;
    this.listener=listener;
  }
  
  public interface ImageLoadListener{
    void imageLoadOk(Bitmap bitmap,String url);
  }
  
  public Bitmap geBitmap(String url){
    Bitmap bitmap=null;
    if(url==null || url.length()<=0)
      return bitmap;
    //1.先看看内存中有没有  
    bitmap=getBitmapFromReference(url);
    if(bitmap!=null){
      System.out.println("1.内存中的图片");
      return bitmap;
    }
    //2.去看看缓存文件有没有
    bitmap=getBitmapFromCache(url);
    if(bitmap!=null){
      //存入内存
      //softReferences.put(url, new SoftReference<Bitmap>(bitmap));
      cache.put(url, bitmap);
      System.out.println("2.缓存中的图片");
      return bitmap;
    }
    //3.异步加载 
    getBitmapAsync(url);    
    return bitmap;
  }
 
  private void getBitmapAsync(String url) {
    ImageAsyncTask imageAsyncTask=new ImageAsyncTask();
    imageAsyncTask.execute(url);
  }
 
  private Bitmap getBitmapFromCache(String url) {
    //http://www.baidu.com/gejge/jgejg/gg.jpg
    String name=url.substring(url.lastIndexOf("/")+1);
    //File cacheDir=context.getCacheDir();
    File cacheDir=context.getExternalCacheDir();
    
    File[] files=cacheDir.listFiles();
    if(files==null){
      return null;
    }
    File bitmapFile=null;
    for (File file : files) {
      if(file.getName().equals(name)){
        bitmapFile=file;
        break;
      }
    }
    if(bitmapFile==null){
      return null;
    }
    Bitmap bitmap=BitmapFactory.decodeFile(bitmapFile.getAbsolutePath());
    if(bitmap==null)
      return null;
    return bitmap;
  }
 
  private Bitmap getBitmapFromReference(String url) {
    Bitmap bitmap=null;
//    if(softReferences.containsKey(url)){
//      bitmap=softReferences.get(url).get();
//    }
    bitmap=cache.get(url);
    return bitmap;
  }
 
  private class ImageAsyncTask extends AsyncTask<String, Void, Bitmap>{
    private String url;
 
    @Override
    protected Bitmap doInBackground(String... params) {
      url=params[0];
      //params[0]--->url
      Bitmap bitmap=null;
      try {
        URL url=new URL(params[0]);
        HttpURLConnection conn=(HttpURLConnection) url.openConnection();
        InputStream is=conn.getInputStream();
        bitmap=BitmapFactory.decodeStream(is);    
//        //软引用 
//        softReferences.put(params[0], new SoftReference<Bitmap>(bitmap));
//        System.out.println(softReferences.size());
        cache.put(params[0], bitmap);
        //缓存文件
        saveCacheFile(params[0],bitmap);
        System.out.println("3.网络中的图片");
      } catch (Exception e) {
        e.printStackTrace();
      }
      return bitmap;
    }
    
    @Override
    protected void onPostExecute(Bitmap result) {
      super.onPostExecute(result);
      if(listener!=null){
        listener.imageLoadOk(result,url);
      }
    }   
  }
 
  public void saveCacheFile(String url,Bitmap bitmap) {
    String name=url.substring(url.lastIndexOf("/")+1);
    //File cacheDir=context.getCacheDir();
    File cacheDir=context.getExternalCacheDir();
    if(!cacheDir.exists()){
      cacheDir.mkdirs();
    }
    OutputStream stream;
    try {
      stream = new FileOutputStream(new File(cacheDir, name));
      bitmap.compress(CompressFormat.JPEG, 100, stream);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
  } 
}
适配器
package com.android1.news.ui.adapter;
 
import com.android1.news.R;
import com.android1.news.common.CommonUtil;
import com.android1.news.common.LoadImage;
import com.android1.news.model.entity.News;
import com.android1.news.ui.base.MyBaseAdapter;
 
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
 
public class NewsAdapter extends MyBaseAdapter<news> {
  private Bitmap defaultBitmap;
  private LoadImage loadImage;
  private ListView listView;
 
  public NewsAdapter(Context context,ListView listView) {
    super(context);
    defaultBitmap=BitmapFactory.decodeResource(context.getResources(), R.drawable.defaultpic);
    loadImage=new LoadImage(context, listener);
    this.listView=listView;
  }
  @Override
  public View getMyView(int position, View convertView, ViewGroup parent) {
    HoldView holdView=null;
    if(convertView==null){
      convertView=inflater.inflate(R.layout.item_list_news, null);
      holdView=new HoldView(convertView);
      convertView.setTag(holdView);
    }else{
      holdView=(HoldView) convertView.getTag();
    }
    News news=myList.get(position);
    holdView.tv_title.setText(news.getTitle());
    holdView.tv_text.setText(news.getSummary());
    holdView.tv_from.setText(news.getAuthor());
    holdView.iv_list_image.setImageBitmap(defaultBitmap);//默认图片
    
    String url=news.getList_image();
    holdView.iv_list_image.setTag(CommonUtil.APPURL+url);
    System.out.println(CommonUtil.APPURL+url);
    Bitmap bitmap=loadImage.geBitmap(CommonUtil.APPURL+url);
    if(bitmap!=null){
      holdView.iv_list_image.setImageBitmap(bitmap);
    }   
    return convertView;
  }
  
  public class HoldView {
    public ImageView iv_list_image;
    public TextView tv_title;
    public TextView tv_text;
    public TextView tv_from;
 
    public HoldView(View view) {
      iv_list_image = (ImageView) view.findViewById(R.id.imageView1);
      tv_title = (TextView) view.findViewById(R.id.textView1);
      tv_text = (TextView) view.findViewById(R.id.textView2);
      tv_from = (TextView) view.findViewById(R.id.textView3);
    }
  }
  
  private LoadImage.ImageLoadListener listener=new LoadImage.ImageLoadListener(){
 
    @Override
    public void imageLoadOk(Bitmap bitmap, String url) {
      ImageView iv=(ImageView) listView.findViewWithTag(url);
      if(iv!=null)
         iv.setImageBitmap(bitmap);
    }   
  };  
}
</news>


目录
相关文章
|
6月前
|
存储 安全 编译器
C++学习过程中的一些值得注意的小点(1)
C++学习过程中的一些值得注意的小点(1)
|
5月前
|
传感器 存储 编解码
数码相机背后的像素秘密:静态与动态的真相
这篇文章探讨了数码摄影中“动态像素”和“静态像素”的概念。像素是图像质量的关键因素,而CCD或CMOS传感器负责将光信号转化为数字图像。RGB差值补偿算法用于恢复色彩,但牺牲了部分分辨率。所谓“动态像素”更多是营销术语,而非技术标准,它反映了拍照和录像时因硬件限制和处理需求不同而产生的差异。随着技术进步,硬件编码器的引入已显著提升视频处理能力,使得高清摄影和视频录制变得更加普遍。理解这些原理有助于消费者做出更明智的设备选择。
|
5月前
|
Linux iOS开发 MacOS
【随手记】maplotlib.use函数设置图像的呈现方式
【随手记】maplotlib.use函数设置图像的呈现方式
55 0
|
6月前
|
计算机视觉
我的自描外挂制作日志——FPS类游戏的自瞄【验证猜想】
我的自描外挂制作日志——FPS类游戏的自瞄【验证猜想】
74 1
图片太大传输和保存不方便?一招解决你的烦恼!
在日常工作中,“拍照”是我们必不可不少的一件事情。写简报、总结都离不开图片。
133 0
|
关系型数据库 MySQL API
被无视的小细节
被无视的小细节
73 0
|
数据库
买手机数据线特别要注意的地方
买手机数据线特别要注意的地方
125 0
|
前端开发
请务必收下这10+个加载特效,保证让你的项目大放异彩⭐(二)
请务必收下这10+个加载特效,保证让你的项目大放异彩⭐(二)
|
前端开发
请务必收下这10+个加载特效,保证让你的项目大放异彩⭐(四)
请务必收下这10+个加载特效,保证让你的项目大放异彩⭐(四)
|
前端开发
请务必收下这10+个加载特效,保证让你的项目大放异彩⭐(三)
请务必收下这10+个加载特效,保证让你的项目大放异彩⭐(三)