1。之前因为做一个项目的过程中遇到要频繁重复下载的文件比如图片等,需要在本地缓存,除了用户体验也保证了省流量。

这个demo是用下载网络图片来演示。

一共有六张网络图片,加载图片时,会判断图片是否下载到本地的文件夹中,如果下载了,直接从文件中读取,如果没有就会去下载,下载完之后通过一个handler通知adapter的notifyDataSetChanged()方法,来对listActivity进行通知,来显示对应的列表。

具体代码如下;

public class CatheAdapter extends BaseAdapter {
    private List<String> mUrl = new ArrayList<String>();
    private LayoutInflater mInflater;
    private Context context;

    public CatheAdapter(Context context) {
        mUrl.add("http://papercut.jd-app.com/learn/Goat_8/2.png");
        mUrl.add("http://papercut.jd-app.com/learn/Goat_8/3.png");
        mUrl.add("http://papercut.jd-app.com/learn/Goat_8/4.png");
        mUrl.add("http://papercut.jd-app.com/learn/Goat_8/5.png");
        mUrl.add("http://papercut.jd-app.com/learn/Goat_8/6.png");
        mUrl.add("http://papercut.jd-app.com/learn/Goat_8/7.png");
        this.context = context;
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return mUrl.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.item,null);
        }
        ImageView image = (ImageView) convertView.findViewById(R.id.image);
        image.setImageBitmap(getBitmap(position));
        return convertView;
    }
    private Bitmap getBitmap(int position){
        Bitmap bitmap = null;
        //File dir = Environment.getExternalStorageDirectory();
        String fileName = File.separator+"sdcard"+File.separator+mUrl.get(position).hashCode();
        if (new File(fileName).exists()) {
            bitmap = BitmapFactory.decodeFile(fileName);
        }else {
            bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher);
            new DownLoadImage(this, mUrl.get(position)).start();
        }
        return bitmap;
    }
}

这是adaopter类的代码。

public class DownLoadImage extends Thread{
    private CatheAdapter catheAdapter;
    private String mUrl;
    private String fileName;
    private File dir;
    private Handler handler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            catheAdapter.notifyDataSetChanged();
        }
    };

    public DownLoadImage(CatheAdapter catheAdapter, String mUrl) {
        this.catheAdapter = catheAdapter;
        this.mUrl = mUrl;
        //dir = Environment.getExternalStorageDirectory();
        fileName = File.separator+"sdcard"+File.separator+mUrl.hashCode();
    }

    @Override
    public void run() {
        URL url;
        try {
            url = new URL(mUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setDoInput(true);
            conn.setDoOutput(true);
            conn.setRequestMethod("GET");
            conn.setUseCaches(false);
            InputStream is = conn.getInputStream();
            FileOutputStream fos = new FileOutputStream(fileName);
            byte[] buffer = new byte[8192];
            int count = 0;
            while ((count = is.read(buffer))>-1) {
                fos.write(buffer,0,count);
            }
            fos.flush();
            fos.close();
            is.close();
            conn.disconnect();
            handler.sendEmptyMessage(0);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

这是下载图片的类,图片放在了sdcard的下面,因为是演示所以这么写了。建议大家如果要新建一个文件。

最后是主要的类。

public class MainActivity extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.setListAdapter(new CatheAdapter(this));
    }
}

布局代码如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="liu.example.cathetest.MainActivity" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>

</RelativeLayout>

这是每一个item的布局代码;

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="liu.example.cathetest.MainActivity" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>

</RelativeLayout>

最后主要权限,除了Internet权限还有访问sdcard的权限。

android 缓存实现的更多相关文章

  1. Android 缓存

    1.Android缓存机制&一个缓存框架推荐 http://blog.csdn.net/shakespeare001/article/details/51695358 2.ASimpleCac ...

  2. Android缓存处理

    Android缓存: 採用缓存,能够进一步大大缓解数据交互的压力,又能提供一定的离线浏览.下边我简略列举一下缓存管理的适用环境: 1. 提供网络服务的应用 2. 数据更新不须要实时更新.哪怕是3-5分 ...

  3. android缓存具体解释

    Android缓存: 採用缓存,能够进一步大大缓解数据交互的压力.又能提供一定的离线浏览.下边我简略列举一下缓存管理的适用环境: 1. 提供网络服务的应用 2. 数据更新不须要实时更新,哪怕是3-5分 ...

  4. 【转】彻底解析Android缓存机制——LruCache

    彻底解析Android缓存机制——LruCache 关于Android的三级缓存,其中主要的就是内存缓存和硬盘缓存.这两种缓存机制的实现都应用到了LruCache算法,今天我们就从使用到源码解析,来彻 ...

  5. Android缓存学习入门(二)

    本文主要包括以下内容 内存缓存策略 文件缓存策略 内存缓存策略 当有一个图片要去从网络下载的时候,我们并不会直接去从网络下载,因为在这个时代,用户的流量是宝贵的,耗流量的应用是不会得到用户的青睐的.那 ...

  6. Android缓存学习入门

    本文主要包括以下内容 利用LruCache实现内存缓存 利用DiskLruCache实现磁盘缓存 LruCache与DiskLruCache结合实例 利用了缓存机制的瀑布流实例 内存缓存的实现 pub ...

  7. Android 缓存目录 Context.getExternalFilesDir()和Context.getExternalCacheDir()方法

    一.基础知识 应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的.大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中.这样当该应用被卸载 ...

  8. Android缓存技术

    android应用程序中 1. 尽可能的把文件缓存到本地.可以是 memory,cache dir,甚至是放进 SD 卡中(比如大的图片和音视频).    可以设置双重缓冲,较大的图片或者音频放到SD ...

  9. android 缓存Bitmap - 开发文档翻译

    由于本人英文能力实在有限,不足之初敬请谅解 本博客只要没有注明“转”,那么均为原创,转贴请注明本博客链接链接 Loading a single bitmap into your user interf ...

  10. android缓存之Lrucache 和LinkedHashMap

    两者的区别 网上有很多人使用软引用加载图片的多 ,但是现在已经不再推荐使用这种方式了,(1)因为从 Android 2.3 (API Level 9)开始,垃圾回收器会更倾向于回收持有软引用或弱引用的 ...

随机推荐

  1. 下载python的Crypto库出现的问题的解决:ModuleNotFoundError: No module named 'Crypto'

    在网上找了很多下载Crypto的方法,感觉作用都不算很大,然后自己瞎搞瞎搞就搞好了

  2. [SHOI 2008]Debt 循环的债务

    Description 题库链接 A 欠 B \(x_1\) 元, B 欠 C \(x_2\) 元, C 欠 A \(x_3\) 元.现每人手上各有若干张 100,50,20,10,5,1 钞票.问至 ...

  3. [POJ]1279: Art Gallery

    题目大意:有一个N边形展馆,问展馆内有多少地方可以看到所有墙壁.(N<=1500) 思路:模板题,半平面交求出多边形的核后计算核的面积. #include<cstdio> #incl ...

  4. 【POJ 1459 power network】

    不可以理解的是,测评站上的0ms是怎么搞出来的. 这一题在建立超级源点和超级汇点后就变得温和可爱了.其实它本身就温和可爱.对比了能够找到的题解: (1)艾德蒙·卡普算法(2)迪尼克算法(3)改进版艾德 ...

  5. SPFA小总结

    关于spfa 知识点 原始版 ---裸 应用: 一.判负环 两种方法 1.跑单源点bfs,如果某一个点入队了n-1次,存在 2.对于每个点dfs,如果此源点反被其他点更新,存在 证明:点i作为源点,d ...

  6. APIO2017 懵逼记

    Day -1: 移步http://www.cnblogs.com/juruolty/p/6854795.html Day 0: CTSC铁牌后,下一个就是APIO了. lmy,sxy,cxc,lh过来 ...

  7. 零开始:NetCore项目权限管理系统:基础框架搭建

    有兴趣的同学可以一起做 喜欢NetCore的朋友,欢迎加群QQ:86594082 源码地址:https://github.com/feiyit/SoaProJect 新建一个空的解决方案,建立对应的解 ...

  8. Express 配置 https / 443 安全链接

    按照教程已配置成功 前一部分内容参照     https://blog.csdn.net/chenyufeng1991/article/details/60340006 前半部分是生成证书文件,关键部 ...

  9. Java内存模型之重排序

    参考链接:https://blog.csdn.net/huzhigenlaohu/article/details/51595676

  10. Big Christmas Tree(poj-3013)最短路

    Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 25823   Accepted: 5 ...