android以流的形式传输文件,android 中通过AIDL传输流文件

需求:

客户端通过AIDL传一段文件流给服务端,服务端根据流还原生成文件并打开

前置条件:

不赘述AIDL的使用方法

示例代码不做详细的容错处理

想法:

如果要通过AIDL把一个文件流传输到另一端,临时可以想得到的一个方法是:

client端的线程通过FileInputStream每次read一个缓冲,通过AIDL相应的去调用server端的方法,把这个缓冲区的byte数组传递到server端,然后server端通过FileOutputStream把这些byte数组write到新生成的临时文件即可。

但这种方法的弊端就是在文件传输期间会阻塞server端。众所周知,service是运行在应用的主线程中的,如果service中出现了很多不在其子线程中运行的阻塞或耗时操作,肯定会影响整个应用的流畅性的,所以这种方法不可行。

解决方法:

问题的关键是如何把接收的过程放到server端的线程中?解决方法是使用管道!但是Android进程间通信用Binder来传递数据,有一个最基本的要求就是要实现Parcelable接口。所以这里就需要用到:

ParcelFileDescriptor[] pfd = ParcelFileDescriptor.createPipe();

pfd[0]是管道的read端

pfd[1]是管道的write端

简单流程说明:

客户端:

先把pfd[0]通过AIDL调用传输给服务端,然后

ParcelFileDescriptor.AutoCloseOutputStream aos =

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值