加载器建立过程中的一些问题

调试记录

  Bitmap网络加载时,若对图片先使用BitmapFactory.decodeStream非全部加载测量,则会导致InputStream起始位置移动,影响下一步的对流的解码,因此解码前需要重置,但是重置的最大限度需要控制(多了会浪费,少了会崩溃),所以网上有采用decodeByteArray解码比特数组,而比特数组内容由ByteArrayOutputStream而得(toByteArray调用的就是Array.copy(byte[], int length), ByteArrayOutputStream实质维护一个大小可扩的byte[]),虽然避免维护readlimit,但是运行时暂时会占用两个图片内存,庆幸的是这两个内存只是局部变量能GC掉。而《Android开发艺术探索》则是直接直接采用BitmapFactory.decodeStream(InputStream),没有测量的直接全部加载。关于BitmapFactory.decode
    关于加载网络图片前是否测量,本人看法如下:
    测量的目的是为了避免内存消耗过大导致OOM,本地图片的话,可以通过文件描述符获取大小后,再进行有必要的内存分配。而采用ByteArrayOutputStream硬生生是多了两个byte[],而且大小等于原始资源图片大小,如果有OMM的话,这个方案恐怕会首当其冲,但是在测试中还没发现OMM。所以选择直接采用BitmapFactory.decodeStream(InputStream),简单有效,这只是个人的猜测,具体问题我已经在Stackoveflow中提出,望各位不吝赐教。
    关于Buffer缓冲:

    不带缓冲是,每读一个字节就要写一个字节,对磁盘IO操作频繁效率低;带缓冲,一次多个字节,先写进内存然后等填满后,批量写入磁盘提高效率。

    InputStream 、 InputStreamReader 、 BufferedReader餐补

  温故而知新,加强理解。

  缓冲输入流(BufferedInputStream)本质上是通过缓冲区中的数组实现的。在新建输入流对应的BufferedInputStream后,当缓冲区数据被读取完毕后,BufferInputStream会将该输入流的数据分批地填入到缓冲区中。缓冲区数据读取完毕后自行填充后继数据。

    错位?而BitmapFactory.decodeStream(InputStream is, Rect outPadding, Options opts)InputStream进行读取将会使得流的起始位置发生向后移动,因此如果解码前先decodeStream测量,Buffer需要reset()重新设置读取InputStream的起始位置,并且需要在mark(int readlimit)进行控制。