Android从网络获取图片,并缓存到SD卡

原创 2015年03月27日 16:46:22

图片存在bmob(http://www.bmob.cn)后台,所以下载Demo运行的话要到官网申请Application ID。
先点击上传图片,再点击缓存图片。

paths=new String[5];
for(int i=0;i<5;i++){
        //图片路径
        paths[i]=Environment.getExternalStorageDirectory()+"/"+i+".jpg";        
  }
上面的代码要改为自己的图片路径。

IndexActivity:

public class IndexActivity extends Activity {

        private String[] paths;
        private int j;
        private File cache;
        private String appid="";  //你的Application ID

        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                Bmob.initialize(this, appid);
                setContentView(R.layout.activity_index);

                ///创建缓存目录
                cache=new File(Environment.getExternalStorageDirectory(),"cache");   
                if(!cache.exists()){
                        cache.mkdirs();
                }
        }

        public void skip(View v){
                Intent intent=new Intent(this,MainActivity.class);
                startActivity(intent);
        }

        public void upload(View v){
                paths=new String[5];
                for(int i=0;i<5;i++){
                        //图片路径
                        paths[i]=Environment.getExternalStorageDirectory()+"/"+i+".jpg";        
                }

                //批量上传图片
                Bmob.uploadBatch(this, paths, new UploadBatchListener() {

                        @Override
                        public void onSuccess(List<BmobFile> arg0, List<String> arg1) {
                                // TODO Auto-generated method stub
                                String strurl="";
                                for(String url:arg1){
                                        strurl=url;
                                }
                                Person p=new Person();
                                p.setIcPath(strurl);
                                p.setStr("s"+j);
                                p.save(IndexActivity.this);
                                j++;
                                toast("第"+j+"个上传成功!");
                        }

                        @Override
                        public void onProgress(int curIndex, int curPercent, int total, int totalPercent) {
                                // TODO Auto-generated method stub

                                //1、curIndex--表示当前第几个文件正在上传
                                //2、curPercent--表示当前上传文件的进度值(百分比)
                                //3、total--表示总的上传文件数
                                //4、totalPercent--表示总的上传进度(百分比)
                                MyUtil.logI(curIndex+" "+curPercent+" "+total+" "+totalPercent);
                                
                        }

                        @Override
                        public void onError(int arg0, String arg1) {
                                // TODO Auto-generated method stub
                                toast("error "+arg1);
                                MyUtil.logI("errer "+arg1);
                        }
                });
        }
        
        // 清理缓存
        public void clear(View v){
                if(cache.length()!=0){
                        File[] files=cache.listFiles();
                        for(File file:files){
                                file.delete();
                        }
                        cache.delete();
                        toast("缓存清理成功");
                }else{
                        toast("暂无缓存");
                }
        }

        public void toast(String msg){
                Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
        }

}
MainActivity:

public class MainActivity extends Activity {

        private ListView lv;
        private MyAdapter adapter;
        private File cache;
        private List<Person> list;
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                initView();
        }

        private void initView() {
                // TODO Auto-generated method stub
                lv=(ListView)findViewById(R.id.listView1);
                list=new ArrayList<Person>();
                
                cache=new File(Environment.getExternalStorageDirectory(),"cache");
                if(!cache.exists()){
                        cache.mkdirs();
                }
                
                getData();
        }

        private void getData() {
                // TODO Auto-generated method stub
                //查询数据
                BmobQuery<Person> bq=new BmobQuery<Person>();
                bq.setCachePolicy(CachePolicy.CACHE_ELSE_NETWORK);        //缓存查询
                bq.findObjects(this, new FindListener<Person>() {
                        
                        @Override
                        public void onSuccess(List<Person> arg0) {
                                // TODO Auto-generated method stub
                                list=arg0;
                                adapter=new MyAdapter(MainActivity.this, list, cache);
                                lv.setAdapter(adapter);
                        }
                        
                        @Override
                        public void onError(int arg0, String arg1) {
                                // TODO Auto-generated method stub
                                MyUtil.logI("errer "+arg1);
                        }
                });
        }
MyAdapter:

public class MyAdapter extends BaseAdapter {
        private Context context;
        private List<Person> list;
        private File cache;
        public MyAdapter(Context context, List<Person> list, File cache) {
                this.context = context;
                this.list = list;
                this.cache = cache;
        }

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

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

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

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                // TODO Auto-generated method stub
                ViewHolder vh;
                if(convertView==null){
                        convertView=LayoutInflater.from(context).inflate(R.layout.item, null);
                        vh=new ViewHolder();
                        vh.tv=(TextView)convertView.findViewById(R.id.tv);
                        vh.iv=(ImageView)convertView.findViewById(R.id.iv);
                        convertView.setTag(vh);
                }else{
                        vh=(ViewHolder)convertView.getTag();
                }
                
                final Person p=list.get(position);
                vh.tv.setText(p.getStr());
                
                // 异步的加载图片
                MyUtil mu=new MyUtil();
                AsyncImageTask as=new AsyncImageTask(mu,vh.iv,cache);
                if(p.getIcPath()!=null){
                        as.execute(p.getIcPath());
                }else{
                        vh.iv.setImageResource(R.drawable.ic_launcher);
                }
                
                return convertView;
        }

        class ViewHolder{
                TextView tv;
                ImageView iv;
        }
        
}
MyUtil:

public class MyUtil {
        /**
         * 从网络上获取图片,如果图片在本地存在的话就直接拿,如果不存在再去服务器上下载图片
         * */
        public Uri getImageURI(String path,File cache) throws Exception{
                String name=MD5.getMD5(path)+path.substring(path.lastIndexOf("."));
                logI("name"+name);
                File file=new File(cache, name);
                // 如果图片存在本地缓存目录,则不去服务器下载
                if(file.exists()){
                        logI("cache");
                        return Uri.fromFile(file);
                }else{
                        URL url=new URL(path);
                        HttpURLConnection conn=(HttpURLConnection)url.openConnection();
                        conn.setConnectTimeout(5000);
                        conn.setRequestMethod("GET");
                        conn.setDoInput(true);
                        if(conn.getResponseCode()==200){
                                InputStream is=conn.getInputStream();
                                FileOutputStream fos=new FileOutputStream(file);
                                byte[] b=new byte[2*1024];
                                int len=0;
                                while((len=is.read(b))!=-1){
                                        fos.write(b,0,len);
                                }
                                is.close();
                                fos.close();
                                return Uri.fromFile(file);
                        }
                }
                return null;
        }
        
        
        public static void logI(String msg){
                Log.i("-------", msg);
        }
}

AsyncImageTask:

public class AsyncImageTask extends AsyncTask<String, Integer, Uri> {

        private ImageView ivIcon;
        private MyUtil mu;
        private File cache;
        public AsyncImageTask(MyUtil mu,ImageView ivIcon,File cache) {
                this.mu=mu;
                this.ivIcon = ivIcon;
                this.cache=cache;
        }

        @Override
        protected Uri doInBackground(String... arg0) {
                // TODO Auto-generated method stub
                try {
                        return mu.getImageURI(arg0[0], cache);
                } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                return null;
        }

        @Override
        protected void onPostExecute(Uri result) {
                // TODO Auto-generated method stub
                super.onPostExecute(result);
                if(ivIcon!=null && result!=null){
                        ivIcon.setImageURI(result);
                }
        }
}
代码主要是上面这些了。


我在eoe的帖子:http://www.eoeandroid.com/thread-569935-1-1.html







Android HTTP请求下载图片并缓存

确定图片的网址 * 发送http请求 URL url = new URL(address); //获取连接对象,并没有建立连接 HttpURLConnection conn =...
  • confusing_awakening
  • confusing_awakening
  • 2017年06月13日 20:26
  • 746

android glide 获取缓存图片

Glide是Google推荐用的图片加载框架,很简单就可以加载出图片了,如下: Glide.with(context).load(ImgUrl).into(ImageView); 也可以加一些常用的功...
  • u012737144
  • u012737144
  • 2017年03月08日 15:02
  • 8724

Android批量下载图片并缓存,非常流畅

  • 2014年07月29日 20:23
  • 1.41MB
  • 下载

Bmob上传、下载文件___(课设遇到的问题)

Bmob的上传、下载文件。 说实话,Bmob的开发文档实在是坑,就写了点最简单的用法,而且当时去网上找资料也是找了好久,没几篇能看的,最后我也不知道怎么的就把上传、下载搞好了。。。现在来总结一下:我...
  • wy_is_learning
  • wy_is_learning
  • 2017年06月24日 17:13
  • 1569

Bmob用户功能详解(三)

这篇文章中就教大家怎样给应用中的用户增加一个用户头像的功能。
  • ynwewrfjhh
  • ynwewrfjhh
  • 2016年01月12日 14:32
  • 5010

基于Bmob平台进行从服务器获取图片数据(url)的操作,并以瀑布流得形式显示图片

最近一直在学习基于Bmob平台的数据交互,网上找了很多例子,但很多因为各种原因没有调试出来。后来转变学习思路,从获取数据开始学起,通过查阅文档,逛帖子找资料,学会了如何获取Bmob服务器端的图片数据,...
  • xuanwo11
  • xuanwo11
  • 2016年09月16日 20:38
  • 2893

Bmob文件上传/下载出现的各种问题记录

1、java.util.concurrent.ExecutionException: com.android.dex.DexException: Multiple dex files define  ...
  • qq_33632159
  • qq_33632159
  • 2018年02月22日 02:23
  • 103

Bmob后端云初体验

首先直接到官网注册注册之后我这里已经注册了不再啰嗦!下面是我创建的应用 因为我讲的是as集成方案 首先下载sdk点击下载 [初体验入门](http://docs.bmob.cn/data...
  • qq_15950325
  • qq_15950325
  • 2017年01月11日 15:00
  • 2284

Bmob 图片文字上传(需要修改项目三处错误,写上你自己的对应代码)

  • 2016年11月22日 00:04
  • 33.25MB
  • 下载

用Bmob实现用户数据添加和查询显示

我用的例子利用Bmob云服务器实现了让用户上传待出售商品信息,以及能浏览在售商品信息的小功能。刚接触Bmob感觉它确实好用,但我不得不吐槽那个案例更新的太慢了,新版本的SDK跟老版本还是有很大差别的,...
  • lj779323436
  • lj779323436
  • 2016年09月17日 15:29
  • 6085
收藏助手
不良信息举报
您举报文章:Android从网络获取图片,并缓存到SD卡
举报原因:
原因补充:

(最多只允许输入30个字)