Acache使用过程的大坑
来源:互联网 发布:贵州省博联大数据商会 编辑:程序博客网 时间:2024/06/07 22:37
安卓比较好用的轻量级的缓存框架就是Acache,在项目中用的一直都挺好的,最近因为缓存了一些比较大的数据,发现读缓存的时间达到4秒,谁也受不了啊,下面我说说我的解决过程;
我的Acache的getAsString是这样的
public String getAsString(String key) { File file = mCache.get(key); if (!file.exists()) return null; boolean removeFile = false; BufferedReader in = null; Log.e("flag--", "ACache--getAsString--162" + ""); try { in = new BufferedReader(new FileReader(file)); String readString = ""; String currentLine; while ((currentLine = in.readLine()) != null) { readString += currentLine; } Log.e("flag--", "ACache--getAsString--170" + ""); if (!Utils.isDue(readString)) { return Utils.clearDateInfo(readString); } else { removeFile = true; return null; } } catch (IOException e) { e.printStackTrace(); return null; } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } if (removeFile) remove(key); }}
1.刚开始的时候我怀疑是数据量太大引起了,在通过打印数据发现我两行的log的间隔
这个时间间隔,我刚开始是怀疑数据太大,但是如此强大的acache的这点数据量怎么会如此慢,我就写了一个demo试试:
看到这样的我真是惊讶,不是我的数据问题,我就对比我数据处理的区别,在demo里我是直接存储的是服务器请求回来的string类型的;
StringRequest request = new StringRequest(url, new Response.Listener<String>() { @Override public void onResponse(String response) { Log.e("flag--", "MainActivity--onResponse--28" + " " + response.length()); model.addCache(response); }}, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { String cache = model.getCache(); tv.setText(cache); Log.e("flag--", "MainActivity--onErrorResponse--35" + " " + cache.length()); }});我存储的是没有处理的string速度是毫秒级的,在项目中是bean类转化的String
罪魁祸首是我tojson的处理,通过打印数据我发现,通过json处理的数据格式化的json数据,这样readline的次数提高了1000次,所以导致了我读取速度这样慢,
罪魁祸首找到了,这样就好处理了。
有两种策略,首先是我们直接存储请求回来的string,这样有一个弊端,你对返回来的数据做了处理之后,再存储还是会出现上述问题,这样不彻底;
再者就是,换流,现在是用的bufferedreader的readline,这是罪魁祸首,我项目中用了bufferedInputStream,在看看效果,还是让人满意的;
public String getAsString(String key) { File file = mCache.get(key); if (!file.exists()) return null;boolean removeFile = false; BufferedInputStream bis = null; try { FileInputStream fis = null; fis = new FileInputStream(file); bis = new BufferedInputStream(fis); String content = ""; //自己定义一个缓冲区 byte[] buffer = new byte[1024 * 8]; int flag = 0; Log.e("flag--","ACache--getAsString--171"+""); while ((flag = bis.read(buffer)) != -1) { content += new String(buffer, 0, flag); } Log.e("flag--","ACache--getAsString--175"+""); if (!Utils.isDue(content)) { return Utils.clearDateInfo(content); } else { removeFile = true; return null; } } catch (Exception e) { e.printStackTrace(); } finally { if (removeFile){ remove(key); } try { if (bis != null){ bis.close(); } } catch (IOException e) { e.printStackTrace(); } } return null; }
效果还是不错的,希望能帮助你!
阅读全文
1 0
- Acache使用过程的大坑
- Acache缓存的使用
- 15.缓存工具类ACache的使用
- Android开发----Acache缓存框架的使用
- 使用ACache缓存List类型的数据
- 使用缓存cache 的大坑
- iOS数组和字典的使用----大坑
- 使用RecyclerView + ViewPager 的两个大坑!
- Swift 使用 NSClassFromString 遇到的大坑
- 微信支付的大坑-1及集成过程
- 【FastDev4Android框架开发】Android 数据缓存器ACache的详解和使用(四)
- html关于find使用时的一次使用大坑
- git 使用新手大坑
- 面试过程中,常见大坑!
- Yii框架中使用Fixtures的一个大坑。。
- MAC OS上使用OpenGL遇到的大坑
- Swift - UITableView的基本使用与一个大坑点
- 【手记】小心在where中使用NEWID()的大坑
- Android实现GridView的item长按拖动删除完美实现(带动画效果)
- java读取json文件的数据
- C宏定义常见用法与条件编译
- 【笨鸟先飞】Java重新学习日记3---数组
- hive支持sql大全(4-6:数值计算/日期函数/条件函数)
- Acache使用过程的大坑
- 新添加的标签触发不了绑定的事件
- css input[type=file] 样式美化,input上传按钮美化
- java面试题2(转载)
- K
- thymeleaf循环 下标 倍数判断
- 怎样将手机屏幕投射到电脑
- Android Scroller讲解及应用
- java操作台输入四位数,判断和是否超过一定数值