Android 弱引用二级缓存实现

本文介绍了一种用于显示新闻列表的自定义适配器实现,该适配器使用软引用和线程池来优化图片加载过程,减少内存泄漏的风险,并提高应用性能。

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

package com.example.gp11_day10_news.adapter;

import java.lang.ref.SoftReference;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import com.example.gp11_day10_news.R;
import com.example.gp11_day10_news.asynctask.DownImageTask;
import com.example.gp11_day10_news.entity.News;
import com.example.gp11_day10_news.tool.Urls;

import android.content.Context;
import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class NewsAdapter extends BaseAdapter {

    private Context context;
    private List<News> datas;

    /*private Object obj = new Object();//强引用---在任何情况下都不会被回收
    //SoftReference----当内存不足时会回收软引用的对象
    String ss = "hello";
    SoftReference<String> soft = new SoftReference<String>(ss);
    soft.get();//hello 得到软引用指向的对象*/

    private ExecutorService es = Executors.newFixedThreadPool(2);

    //使用一级缓存,也就是内存来对图片进行缓存
    //map集合的键是图片的地址,值是图片的软引用
    //把第一次下载的图片存入map,当再次下载时先从缓存中判断是否有该图片
    private Map<String,SoftReference<Bitmap>> imageCatche = new HashMap<String,SoftReference<Bitmap>>();



    public NewsAdapter(Context context, List<News> datas) {
        super();
        this.context = context;
        this.datas = datas;
    }

    @Override
    public int getCount() {
        int count = 0;
        if(datas!=null)
            count = datas.size();
        return count;
    }

    @Override
    public Object getItem(int position) {
        return datas.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, final ViewGroup parent) {
        if(convertView==null)
        {
            convertView = LayoutInflater.from(context).inflate(R.layout.item_news, parent, false);
            ViewHolder holder =new ViewHolder();
            holder.imageView = (ImageView) convertView.findViewById(R.id.imageView);
            holder.text_subject = (TextView) convertView.findViewById(R.id.text_subject);
            holder.text_summary = (TextView) convertView.findViewById(R.id.text_summary);
            holder.text_changed = (TextView) convertView.findViewById(R.id.text_changed);

            convertView.setTag(holder);
        }
        ViewHolder holder = (ViewHolder) convertView.getTag();

        News news = datas.get(position);
        holder.text_subject.setText(news.getSubject());
        holder.text_summary.setText(news.getSummary());
        holder.text_changed.setText(news.getChanged());

        //得到图片路径
        String imageUrl = "http://litchiapi.jstv.com"+news.getCover();
        holder.imageView.setTag(imageUrl);//防止图片错位
        holder.imageView.setImageResource(R.drawable.ic_launcher);

        //先取缓存中查找是否有需要下载的图片
        SoftReference<Bitmap> soft = imageCatche.get(imageUrl);
        if(soft!=null)
        {
            Bitmap bitmap = soft.get();
            if(bitmap!=null)
                holder.imageView.setImageBitmap(bitmap);
            else
                //使用异步任务下载图片
                downImage(imageUrl,parent);
        }
        else
            //使用异步任务下载图片
            downImage(imageUrl,parent);


        //使用异步任务下载图片
//      new DownImageTask(new DownImageTask.DownBack() {
//          
//          @Override
//          public void response(String url, Bitmap bitmap) {
//              
//              ImageView imageView = (ImageView) parent.findViewWithTag(url);
//              if(imageView!=null)
//                  imageView.setImageBitmap(bitmap);
//          }
//      } ).execute(imageUrl);

        return convertView;
    }

    //下载图片的函数
    public void downImage(final String imageUrl,final ViewGroup parent)
    {
        new DownImageTask(new DownImageTask.DownBack() {

            @Override
            public void response(String url, Bitmap bitmap) {

                ImageView imageView = (ImageView) parent.findViewWithTag(url);
                if (imageView != null)
                    imageView.setImageBitmap(bitmap);
                //把图片放入缓存
                imageCatche.put(url, new SoftReference<Bitmap>(bitmap));
            }
        }).executeOnExecutor(es, imageUrl);
    }

    class ViewHolder
    {
        ImageView imageView;
        TextView text_subject,text_summary,text_changed;
    }

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值