从零开始搭建android App 日志(3)

由于我们使用的是volley数据交互框架,我们在传输和接收图片的时候使用的是字符串数据类型,因此没有图片缓存机制,

所以在接受list转换的jsonarray数据时,我们可以不传输图片,而是适配器中给item绑定数据的时候再从服务器中加载图片数据,

但是每次绑定数据都要从服务器中加载图片数据(特别是联系人头像)对于流量过于浪费,也会对服务器造成负担,所以我们可以优化一下,

(1)在图片首次加载的时候把图片保存在sd卡中

public  void savePic(Bitmap b,String name) {

    FileOutputStream fos = null;
    try {

        File sd= Environment.getExternalStorageDirectory();
//判断文件加是否存在,不存在就建立
        String path=sd.getPath()+"/文件夹名";
        File file=new File(path);
        if(!file.exists())
        { file.mkdir();}
        String sdpath =Environment.getExternalStorageDirectory()+"/文件夹名/";
        File f = new File(sdpath +name+".png");
//判断图片是否存在,存在就删除
        if (f.exists()) {
            f.delete();
        }

        fos = new FileOutputStream(f);
        if (null != fos) {
            b.compress(Bitmap.CompressFormat.PNG, 90, fos);
            fos.flush();
            fos.close();
        }
    } catch (FileNotFoundException e) {

        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
(2)在要使用图片时判断图片是否已经在sd卡中存在

public boolean ImgIsExists(String name){
    try{
        File f=new File(Environment.getExternalStorageDirectory()+"/文件夹名/"+name+".png");
        if(!f.exists()){
            return false;
        }

    }catch (Exception e) {
        return false;
    }
    return true;
}
(3)如果图片存在sd卡中就可以从sd卡中调用
public Bitmap GetImgInSdcard(String name){
    String path=Environment.getExternalStorageDirectory()+"/文件夹名/"+name+".png";
    File mFile=new File(path);
    Bitmap bitmap=null;
    //若该文件存在
    if (mFile.exists()) {
         bitmap=BitmapFactory.decodeFile(path);

    }
    return bitmap;
}
(4)每次要加载图片是判断是否存在于sd卡中,如果不存在才从服务器中加载(关于图片操作的类我封装在Bitmap_String 中

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewholder = null;
    Person person= persons.get(position);
if (convertView == null) {
    viewholder = new ViewHolder();
    convertView = inflater.inflate(R.layout.person_item, null);
    viewholder.tv_Img=(ImageView)convertView.findViewById(R.id.Img);

    convertView.setTag(viewholder);
} else {
    viewholder = (ViewHolder) convertView.getTag();
}


Bitmap_String bs=new Bitmap_String();

if(bs.ImgIsExists(String.valueOf(person.getUserId()))){
    bitmap=bs.GetImgInSdcard(String.valueOf(person.getUserId()));
}else {
//post参数
    Map<String, String> map2 = new HashMap<String, String>();
    map2.put("userId", String.valueOf(person.getUserId()));

    RequestQueue requestQueue2 = Volley.newRequestQueue(context.getApplicationContext());
    Request<JSONObject> request2 = new NormalPostRequest("网站链接",
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {

                    try {
///返回的数据
                        stringImg = response.getString("userImg");


                    } catch (JSONException e) {

                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
        }
    }, map2);
    requestQueue2.add(request2);
    person.setUserImg(stringImg);
    bitmap = bs.convertStringToIcon(stringImg);
    bs.savePic(bitmap, String.valueOf(person.getUserId()));
}
viewholder.tv_Img.setImageBitmap(bitmap);
return convertView;

}
当然要操作sd卡我们还得在AndroidManifest.xml中添加操作权限
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

欢迎大神给修改意见

邮箱 1159828111@qq.com


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值