最近在做微信分享时,发现android端sdk内置的url传递图片分享形式失效了【对应的api已经从sdk中移除了】

对于上面提到的图片分享的解决方案有两种: 一种是外界统一传bitmap到sdk内分享,一种是sdk内部解析外界传入的url然后
再传。【这里为了方便以后扩展提供了内置url转bitmap的方式】
对应url转bitmap这里采用了 java原生的输入输出流方式处理,URL-InputStream-ByteArrayOutputStream-BufferOutputStream
【代码后期补上】
这里只提:BufferOutputStream和ByteArrayOutputStream
new ByteArrayOutputStream() 后 扔到BufferOutputStream的构造中,先通过BufferOutputStream 缓冲buffer数组缓冲(待会再谈buffer在java io流中的意义)
在InputStream和OutputStream流中调用write写数据时,不管io流采用装饰者还是适配者等设计模式,怎样去使用最终都会转换成一个一个的数据流形式进行数据读写
而对于包装了ByteArrayOutputStream的BufferOutputStream,起到的作用和ByteArrayOutputStream不同,对应的使用场景是缓冲数据,并最终对接输出流,减少频繁io带来的性能损耗。而ByteArrayOutputStream则起到快速扩容和copy array的作用,通过空间换时间将目标byte[] copy 到缓存中,最终我们需要用到的是该类的 toByteArray 得到从InputStream的byte[] 形式的bitmap
另外前面提到的buffer的作用:cpu管理所有总线,而频繁的io需要cpu去频繁确认io的操作执行,构建buffer会采用DMA【direct memory access 直接内存交互】,而DMA存在的意义在于分担cpu在频繁io中的压力,cpu在开启DMA时会传递控制参数,DMA启用时会向cpu发起dma请求,cpu让出总线管理权到dma,再由dma完成最终的数据读写,最终再根据数据的读写状态回传信息到cpu(成功失败),交回总线控制权
ps:DMA请求优先级高于中断指令,cpu会优先响应DMA请求保证内存中buffer的数据正常读写
参考
DMA数据传输简介:
https://blog.youkuaiyun.com/a675311/article/details/49274739
ByteArrayOutputStream和BufferOutputStream的详细对比:
https://blog.youkuaiyun.com/ohyesurright/article/details/20928755

本文探讨在Android微信分享图片时遇到的问题,由于SDK接口变更,需将URL转换为Bitmap。通过Java IO流,特别是ByteArrayOutputStream和BufferOutputStream实现此功能。BufferOutputStream作为缓冲流减少频繁IO操作,提高性能,而ByteArrayOutputStream用于快速扩容和获取byte数组。DMA在IO中的作用也进行了简要说明。
2890





