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;  }

效果还是不错的,希望能帮助你!