Android使用AIDL+MemoryFile传递大数据

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: Android使用AIDL+MemoryFile传递大数据

Android进程间通信经常会使用AIDL,简单方便,但是数据量有限制,超过一定值会报错:

E  !!! FAILED BINDER TRANSACTION !!!  (parcel size = 2073744)


可以通过使用AIDL+MemoryFile传递大数据

新建AIDL接口:
interface OnFileListener{
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void onFile(in ParcelFileDescriptor file);
}

添加监听接口

void addFileListener(OnFileListener listener);

服务端发送数据

 MemoryFile imageFile = new MemoryFile(System.currentTimeMillis()+"image.data",image.length);
 imageFile.writeBytes(image,0,0,image.length);
 ParcelFileDescriptor pfd = getParcelFileDescriptor(imageFile);
 if (pfd!=null){
      listener.sendFile(pfd);
 }
 
 fun getParcelFileDescriptor(memoryFile: MemoryFile): ParcelFileDescriptor? {
        return try {
            val method: Method = MemoryFile::class.java.getDeclaredMethod("getFileDescriptor")
            method.setAccessible(true)
            val fd: FileDescriptor = method.invoke(memoryFile) as FileDescriptor
            ParcelFileDescriptor.dup(fd)
        } catch (e: Exception) {
            e.printStackTrace()
            null
        }
    }

客户端接收数据

      service.addFileListener(new OnFileListener.Stub() {
                    @Override
                    public void onFile(ParcelFileDescriptor pfd) throws RemoteException {
                        try {
                            FileInputStream fis = new FileInputStream(pfd.getFileDescriptor());
                            ByteArrayOutputStream bos = new ByteArrayOutputStream();
                            byte[] buf = new byte[1920*1080];
                            int len;
                            while ((len = fis.read(buf)) != -1) {
                                bos.write(buf, 0, len);
                            }                      
                            bos.close();
                            fis.close();
                            pfd.close();
                        }catch (Exception e){
                            e.printStackTrace();
                        }
                    }
                });

实测实时传递Camera数据比较流畅

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
相关文章
|
6月前
|
安全 Java 定位技术
Android 浅度解析:AIDL & Binder (1)
Android 浅度解析:AIDL & Binder (1)
196 0
|
5月前
|
大数据 API Android开发
Android MemoryFile 共享内存
Android MemoryFile 共享内存
66 0
|
6月前
|
Android开发
Android AIDL 的使用
Android AIDL 的使用
46 1
|
6月前
|
Android开发
Android stdio 无法新建或打开AIDL文件(解决方法)
Android stdio 无法新建或打开AIDL文件(解决方法)
513 0
|
6月前
|
Java Android开发
[Android AIDL] --- AIDL工程搭建
[Android AIDL] --- AIDL工程搭建
67 0
|
6月前
|
Java 开发工具 Android开发
[Android AIDL] --- AIDL原理简析
[Android AIDL] --- AIDL原理简析
103 0