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

简介: 联网加载图片,一个很原始,很古老的办法
加载图片的工具类
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>


目录
相关文章
|
7月前
|
存储 安全 编译器
C++学习过程中的一些值得注意的小点(1)
C++学习过程中的一些值得注意的小点(1)
|
7月前
|
Java 计算机视觉 Python
我的自描外挂制作日志——FPS类游戏的自瞄【优化改进1】
我的自描外挂制作日志——FPS类游戏的自瞄【优化改进1】
129 1
|
6月前
|
传感器 存储 编解码
数码相机背后的像素秘密:静态与动态的真相
这篇文章探讨了数码摄影中“动态像素”和“静态像素”的概念。像素是图像质量的关键因素,而CCD或CMOS传感器负责将光信号转化为数字图像。RGB差值补偿算法用于恢复色彩,但牺牲了部分分辨率。所谓“动态像素”更多是营销术语,而非技术标准,它反映了拍照和录像时因硬件限制和处理需求不同而产生的差异。随着技术进步,硬件编码器的引入已显著提升视频处理能力,使得高清摄影和视频录制变得更加普遍。理解这些原理有助于消费者做出更明智的设备选择。
|
7月前
|
计算机视觉
我的自描外挂制作日志——FPS类游戏的自瞄【验证猜想】
我的自描外挂制作日志——FPS类游戏的自瞄【验证猜想】
81 1
|
7月前
|
SQL 定位技术 Android开发
分享119个Android手机应用源代码总有一个是你想要的
分享119个Android手机应用源代码总有一个是你想要的
384 2
|
7月前
|
Java 计算机视觉
我的自描外挂制作日志——FPS类游戏的自瞄【优化改进2】
我的自描外挂制作日志——FPS类游戏的自瞄【优化改进2】
83 0
|
7月前
|
移动开发 JavaScript C#
分享53戏源代码总有一个是你想要的(亲测每一个均可用)
分享53戏源代码总有一个是你想要的(亲测每一个均可用)
126 0
图片太大传输和保存不方便?一招解决你的烦恼!
在日常工作中,“拍照”是我们必不可不少的一件事情。写简报、总结都离不开图片。
139 0
|
Web App开发 机器学习/深度学习 TensorFlow
图片迟迟加载不了、一片马赛克?谷歌开源模型优先显示图像受关注部分
图片迟迟加载不了、一片马赛克?谷歌开源模型优先显示图像受关注部分
图片迟迟加载不了、一片马赛克?谷歌开源模型优先显示图像受关注部分
|
人工智能 算法
为什么很少有游戏支持场景破坏?是因为技术问题吗?
最近很多游戏狂热迷们正火热讨论的一个问题是:为什么很少有游戏支持场景破坏?说实话小编也非常好奇,于是乎小编去查了好多资料。接下来小编带领大家一起去深挖究竟!
144 0
为什么很少有游戏支持场景破坏?是因为技术问题吗?