离线下载缓存图片

来源:互联网 发布:淘宝红人狼宝扒皮 编辑:程序博客网 时间:2024/04/27 16:06

本博客主要用来说明,在安卓app开发过程中,离线下载的图片如何缓存,其主要是运用imageloader来缓存图片

主要代码如下
主acivity里面的代码

package com.example.load___;import java.util.ArrayList;import com.nostra13.universalimageloader.core.ImageLoader;import com.nostra13.universalimageloader.core.assist.FailReason;import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.graphics.Bitmap;import android.net.ConnectivityManager;import android.net.NetworkInfo;import android.os.Bundle;import android.view.View;import android.widget.ListView;public class MainActivity extends Activity {    /**     * 模拟接口里的图片地址     */    String[] picPath1 = new String[] {            "https://gw.alicdn.com/tps/TB133PFKpXXXXbIXFXXXXXXXXXX-520-280.jpg",            "https://aecpm.alicdn.com/simba/img/TB1yWIyKXXXXXbwXXXXSutbFXXX.jpg",            "https://img.alicdn.com/tps/TB1E_kqKpXXXXcGXXXXXXXXXXXX-520-280.jpg",            "https://aecpm.alicdn.com/simba/img/TB1pKE2JVXXXXbpaXXXSutbFXXX.jpg",            "https://img.alicdn.com/bao/uploaded/i1/TB1r5K.KpXXXXcyXpXXXXXXXXXX_!!0-item_pic.jpg_430x430q90.jpg",            "https://img.alicdn.com/imgextra/i2/1062618758/TB25Q60qpXXXXXVXpXXXXXXXXXX_!!1062618758.jpg_60x60q90.jpg",            "https://img.alicdn.com/imgextra/i2/1062618758/TB2sdDMqFXXXXcsXXXXXXXXXXXX_!!1062618758.jpg",            "https://gw.alicdn.com/bao/uploaded/i7/63418204/TB2DHUkpVXXXXbsXXXXXXXXXXXX_!!63418204.jpg_280x380xz.jpg",            "https://gw.alicdn.com/bao/uploaded/i8/380101244/TB2V3jSpVXXXXcKXXXXXXXXXXXX_!!380101244.jpg_280x380xz.jpg",            "https://gw.alicdn.com/bao/uploaded/i4/43084091/TB2Oy7RoFXXXXcyXXXXXXXXXXXX_!!43084091.jpg_280x380xz.jpg",            "https://gw.alicdn.com/bao/uploaded/i6/TB1enEaJVXXXXbhXFXXXXXXXXXX_!!0-item_pic.jpg_280x380xz.jpg",            "https://gw.alicdn.com/bao/uploaded/i7/TB1YOmRJFXXXXc.aXXXYXGcGpXX_M2.SS2_280x380xz.jpg",            "https://gw.alicdn.com/bao/uploaded/i0/TB1S9dLJFXXXXXVaXXXYXGcGpXX_M2.SS2_280x380xz.jpg",            "https://gw.alicdn.com/bao/uploaded/i6/2115168470/TB2LGwsnFXXXXXKXFXXXXXXXXXX_!!2115168470.jpg_280x380xz.jpg",            "https://gw.alicdn.com/bao/uploaded/i7/140750234460572075/TB1YQBMKpXXXXXLXXXXXXXXXXXX_!!0-pix.jpg_280x380xz.jpg",    };    private ListView listView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        listView = (ListView) findViewById(R.id.listView);        // 如果有网用网络数据,如果没有就用数据库的数据        if (isNetWorkAvailable(this)) {        } else {            listView.setAdapter(new Myadapter(this,picPath1));        }    }    // 离线下载跳转按钮    public void offline(View v) {        startActivityForResult(new Intent(this, TypeActivity.class), 9);    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        // TODO Auto-generated method stub        super.onActivityResult(requestCode, resultCode, data);        // 得到要离线下载的数据类型        ArrayList<String> list = data.getStringArrayListExtra("type");        // 1.得到每个类型对应的接口地址        // 2.通过请求每个接口地址,得到json信息        // 3.把json里图片的地址拿到,并请求        // 4.将json信息存到数据库        // ////////////////////////////////////        for (String string : picPath1) {            ImageLoader imageLoader = ImageLoader.getInstance();            imageLoader.loadImage(string, new ImageLoadingListener() {                @Override                public void onLoadingStarted(String arg0, View arg1) {                }                @Override                public void onLoadingFailed(String arg0, View arg1,                        FailReason arg2) {                }                @Override                public void onLoadingComplete(String arg0, View arg1,                        Bitmap arg2) {                }                @Override                public void onLoadingCancelled(String arg0, View arg1) {                }            });        }    }    /**     * 判断网络是否可用     *      * @param context     * @return     */    public boolean isNetWorkAvailable(Context context) {        ConnectivityManager manager = (ConnectivityManager) context                .getSystemService(Context.CONNECTIVITY_SERVICE);        if (manager != null) {            NetworkInfo info = manager.getActiveNetworkInfo();            if (info != null && info.isConnected()) {                return true;            } else {                return false;            }        } else {            return false;        }    }}下面这个是application,主要是对imageloader设置一个内存缓存策略

package com.example.load___;

/**
*
*/

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import com.nostra13.universalimageloader.cache.disc.DiskCache;
import com.nostra13.universalimageloader.cache.disc.impl.LimitedAgeDiskCache;
import com.nostra13.universalimageloader.cache.disc.impl.ext.LruDiskCache;
import com.nostra13.universalimageloader.cache.disc.naming.FileNameGenerator;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.MemoryCache;
import com.nostra13.universalimageloader.cache.memory.impl.FIFOLimitedMemoryCache;
import com.nostra13.universalimageloader.cache.memory.impl.LargestLimitedMemoryCache;
import com.nostra13.universalimageloader.cache.memory.impl.LimitedAgeMemoryCache;
import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache;
import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration.Builder;
import com.nostra13.universalimageloader.core.download.ImageDownloader;

import android.app.Application;
import android.os.Environment;
import android.widget.Toast;

/**
* @author WJL
*
*/
public class MyApplication extends Application {
private int maxMemory;

@Overridepublic void onCreate() {    super.onCreate();    System.out.println("MyApplication");    maxMemory = ((int) Runtime.getRuntime().maxMemory()) / 1024 / 1024;              System.out.println("最大内存:"+maxMemory);              Toast.makeText(this, "   "+maxMemory, 0).show();     //初始ImageLoader    initImageLoader();}/** *                //初始ImageLoader */@SuppressWarnings("deprecation")private void initImageLoader() {    //得到ImageLoader实例    ImageLoader imageLoader=ImageLoader.getInstance();    //得到ImageLoader配置的建筑者对象    ImageLoaderConfiguration.Builder builder=new Builder(this);    //设置磁盘(sd卡)缓存的大小限制

// builder.diskCacheSize(maxCacheSize);
try {
// imageDownloader
//设置磁盘(sd卡)缓存策略,参数一:缓存文件的路径,参数二:文件名的命名方法,有MD5,HashCode,参数三:缓存的最大内存
builder.discCache(new LruDiskCache(new File(Environment.getExternalStorageDirectory().getPath()+”/aaa”), new Md5FileNameGenerator(), 2*1024*1204));
//设置磁盘(sd卡)缓存策略,限制缓存时间;参数一:缓存文件的路径,参数二:缓存文件的存活时间,系统当前时间-文件的最新修改时间 > maxAge
// builder.discCache(new LimitedAgeDiskCache(cacheDir, maxAge) );
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

    //设置内存缓存的大小限制,默认是最大内存的1/8    builder.memoryCacheSize(maxMemory/8);    //设置内存缓存策略                根据先进先出的原则上删除多余对象  LinkedList  参数一:设置的缓存内存大小

// builder.memoryCache(new FIFOLimitedMemoryCache(sizeLimit));

    //设置内存缓存策略          先删除占内存最大的图片      HashMap    参数一:设置的缓存内存大小

// builder.memoryCache(new LargestLimitedMemoryCache(sizeLimit));

     //    设置内存缓存策略    Lru算法   LinkedHashMap  最大的缓存大小

// builder.memoryCache(new LruMemoryCache(maxSize))

    //设置内存缓存策略        最少被用到的对象会被删除      HashMap    参数一:设置的缓存内存大小

// builder.memoryCache(new UsingFreqLimitedMemoryCache(sizeLimit))

    //设置内存缓存策略        最早被添加的对象会被删除     HashMap  参数一:MemoryCache对象   参数二:缓存失效的最大时间

// builder.memoryCache(new LimitedAgeMemoryCache(cache, maxAge));

    //初始化imageLoader配置    imageLoader.init(builder.build());/*      使用默认的缓存策略    ImageLoader imageLoader2=ImageLoader.getInstance();    ImageLoaderConfiguration.Builder configuration=new ImageLoaderConfiguration.Builder(this);    imageLoader2.init(configuration.build());    */}

}

下面是适配器里面的方法

package com.example.load___;import com.nostra13.universalimageloader.core.ImageLoader;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;public class Myadapter extends BaseAdapter {    private MainActivity mainActivity;    private String[] picPath1;    public Myadapter(MainActivity mainActivity, String[] picPath1) {        this.mainActivity = mainActivity;        // TODO Auto-generated constructor stub        this.picPath1 = picPath1;    }    @Override    public int getCount() {        // TODO Auto-generated method stub        return picPath1.length;    }    @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) {        convertView=View.inflate(mainActivity, R.layout.item, null);        ImageView imageView = (ImageView) convertView.findViewById(R.id.imageView);        ImageLoader imageLoader = ImageLoader.getInstance();        imageLoader.displayImage(picPath1[position], imageView);        return convertView;    }}下面这个是跳转到类型界面

package com.example.load___;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class TypeActivity extends Activity {
String[] arr = new String[] {

"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12",};private ListView listView;ArrayList<String> list = new ArrayList<String>();@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_type);    listView = (ListView) findViewById(R.id.listView);    listView.setAdapter(new ArrayAdapter<String>(this,            android.R.layout.simple_list_item_1, arr));    listView.setOnItemClickListener(new OnItemClickListener() {        @Override        public void onItemClick(AdapterView<?> parent, View view,                int position, long id) {            if (!list.contains(arr[position])) {                list.add(arr[position]);            }        }    });}public void load(View v) {    if (isNetWorkAvailable(this)) {        Intent intent = new Intent();        intent.putStringArrayListExtra("type", list);        setResult(99, intent);        finish();    } else {        Toast.makeText(this, " 网络不可用  ", 1).show();    }}/** * 判断网络是否可用 *  * @param context * @return */public boolean isNetWorkAvailable(Context context) {    ConnectivityManager manager = (ConnectivityManager) context            .getSystemService(Context.CONNECTIVITY_SERVICE);    if (manager != null) {        NetworkInfo info = manager.getActiveNetworkInfo();        if (info != null && info.isConnected()) {            return true;        } else {            return false;        }    } else {        return false;    }}

}
以上就是一个简单的离线下载缓存图片功能!希望可以给大家一点帮助!

0 0