由于我们使用的是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