一起动手编写Android图片加载框架

2019-12-10 18:16:05王冬梅

if (editor != null) {
  OutputStream outputStream = editor.newOutputStream(0); //参数为索引,由于我们创建时指定一个节点只有一个缓存对象,所以传入0即可
}

    获取了输出流后,我们就可以向这个输出流中写入图片数据,成功写入后调用commit方法即可,若写入失败则调用abort方法进行回退。相关的代码如下:

//getStream为我们自定义的方法,它通过URL获取输入流并写入outputStream,具体实现后文会给出
if (getStreamFromUrl(url, outputStream)) {
  editor.commit();
} else {
  //返回false表示写入outputStream未成功,因此调用abort方法回退整个操作
  editor.abort();
}
mDiskLruCache.flush(); //将内存中的操作记录同步到日志文件中

    下面我们来看一下getStream方法的实现,这个方法实现很直接简单,就是创建一个HttpURLConnection,然后获取InputStream再写入outputStream,为了提高效率,使用了包装流。该方法的代码如下:

public boolean getStreamFromUrl(String urlString, OutputStream outputStream) {
  HttpURLConnection urlCOnnection = null;
  BufferedInputStream bis = null;
  BufferedOutputStream bos = null;
  
  try {
    final URL url = new URL(urlString);
    urlConnection = (HttpURLConnection) url.openConnection();
    bis = new BufferedInputStream(urlConnection.getInputStream(), BUF_SIZE);
    
    int byteRead;
    while ((byteRead = bis.read()) != -1) {
      bos.write(byteRead);
    }
    return true;
  }catch (IOException e) {
    e.printStackTrace();
  } finally {
    if (urlConnection != null) {
      urlConnection.disconnect();
    }
    //HttpUtils为一个自定义工具类
    HttpUtils.close(bis);
    HttpUtils.close(bos);
  }
  return false;
}