首页 > 软件编程 > Android > Android跨进程传递大数据

Android跨进程传递大数据的方法实现

作者:R7_Perfect

这篇文章主要介绍了Android跨进程传递大数据的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

最近要从Service端给Client端传递图片数据,之前的数据都是通过aidl传递:

创建 Parcelable文件

ImageData.java
public class ImageData implements Parcelable { private byte[] data; public byte[] getData() { return data; public ImageData(byte[] dataIn) { this.data = dataIn; public ImageData(Parcel in) { int arrayLength = in.readInt(); if (arrayLength > 0) { data = new byte[arrayLength]; in.readByteArray(data); @Override public void writeToParcel(Parcel dest, int flags) { if (data != null && data.length > 0) { dest.writeInt(data.length); dest.writeByteArray(data); } else { dest.writeInt(0); test.aidl interface test { void sendMessage(ImageData data);

运行报错:

android.os.DeadObjectException: Transaction failed on small parcel; remote process probably died
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(BinderProxy.java:514)

这里导致DeadObjectException的原因主要是binder创建的buffer被占满了:

kernel/msm-4.4/drivers/android/binder_alloc.c
315     if (best_fit == NULL) {
341         pr_err("%d: binder_alloc_buf size %zd failed, no address space\n",
342                   alloc->pid, size);
343         pr_err("allocated: %zd (num: %zd largest: %zd), free: %zd (num: %zd largest: %zd)\n",
344                       total_alloc_size, allocated_buffers, largest_alloc_size,
345                  total_free_size, free_buffers, largest_free_size);
346            eret = ERR_PTR(-ENOSPC);
347              goto error_unlock;
348    }

传输中如果数据大于free_buffers,则会抛出DeadObjectException

1.socket
socke传输不受大小限制,但实现比较复杂

通过文件传输比较简单,但效率差,而且高版本会受到Android系统权限限制

3.数据切割
将较大数据切割成较小的数据传输,此方法是兼顾效率,复杂度较好的方案

定义数据体:
public class SliceData implements Parcelable { private byte[] data; private int length;

切割数据方法:
public static byte[][] divideArray(byte[] source, int chunkSize) { int totalLength = source.length; int arraySize = (int) Math.ceil(totalLength / (double) chunkSize); byte[][] ret = new byte[arraySize][chunkSize]; int start = 0; int parts = 0; for (int i = 0; i < arraySize; i++) { if (start + chunkSize > totalLength) { System.arraycopy(source, start, ret[i], 0, source.length - start); } else { System.arraycopy(source, start, ret[i], 0, chunkSize); start += chunkSize; parts++; return ret;

将SliceData按顺序构建发送:
byte[][] divideData = divideArray(testBytes, 64 * 1024);//64k for (byte[] item : divideData) { mEmitter.onNext(new SliceData(length, item));

client接收:
int chunkSize = bytes.length; if(buffer == null) { buffer = new byte[length]; index = 0; if (index + chunkSize > bodyLength) {//最后一个数据块 System.arraycopy(bytes, 0, buffer, index, bodyLength - index); visualResultData.bitmap = BitmapFactory.decodeByteArray(buffer, 0, buffer.length); buffer = null; index = 0; } else { System.arraycopy(bytes, 0, buffer, index, chunkSize); index += chunkSize;

4.第三方
binder本身也是利用mmap,可以利用实现mmap的框架,比如 MMKV

5.Bitmap
如果传输的数据是Bitmap,还可以用Bundle的putBinder方案
定义binder:
class ImageBinder extends IRemoteGetBitmap.Stub { @Override public Bitmap getBitMap() throws RemoteException { return mBitmap; Bundle bundle = new Bundle(); bundle.putBinder("bitmap", new ImageBinder()); intent.putExtras(bundle); ImageBinder imageBinder = (ImageBinder) bundle.getBinder("bitmap"); Bitmap bitmap = imageBinder.getBitmap();

到此这篇关于Android跨进程传递大数据的方法实现的文章就介绍到这了,更多相关Android跨进程传递大数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
  • Kotlin入门学习教程之可见性修饰符
    Kotlin入门学习教程之可见性修饰符
    2021-11-11
  • Android使用SimpleDateFormat警告介绍
    Android使用SimpleDateFormat警告介绍
    2021-11-11
  • Android使用ContentProvider实现查看系统短信功能
    Android使用ContentProvider实现查看系统短信功能
    2021-11-11
  • Android SeekBar 自定义thumb旋转动画效果
    Android SeekBar 自定义thumb旋转动画效果
    2021-11-11
  • 通俗易通讲解Android蓝牙键值适配
    通俗易通讲解Android蓝牙键值适配
    2021-11-11
  • Windows下Flutter+Idea环境搭建及配置
    Windows下Flutter+Idea环境搭建及配置
    2021-11-11
  • 图文详解Flutter单例的实现
    图文详解Flutter单例的实现
    2021-11-11
  • Android CameraX结合LibYUV和GPUImage自定义相机滤镜
    Android CameraX结合LibYUV和GPUImage自
    2021-11-11
  • 美国设下计谋,用娘炮文化重塑日本,已影响至中国
    美国设下计谋,用娘炮文化重塑日本,已影响至中国
    2021-11-19
  • 时空伴随者是什么意思?时空伴随者介绍
    时空伴随者是什么意思?时空伴随者介绍
    2021-11-09
  • 工信部称网盘企业免费用户最低速率应满足基本下载需求,天翼云盘回应:坚决支持,始终
    工信部称网盘企业免费用户最低速率应满足基本下载需求,天翼云盘回应:坚决支持,始终
    2021-11-05
  • 2022年放假安排出炉:五一连休5天 2022年所有节日一览表
    2022年放假安排出炉:五一连休5天 2022年所有节日一览表
    2021-10-26
  • 电脑版 - 返回首页

    2006-2023 脚本之家 JB51.Net , All Rights Reserved.
    苏ICP备14036222号