iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android跨进程传递大数据的方法实现
  • 420
分享到

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

2024-04-02 19:04:59 420人浏览 安东尼
摘要

最近要从Service端给Client端传递图片数据,之前的数据都是通过aidl传递: 创建 Parcelable文件 ImageData.java public clas

最近要从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传输不受大小限制,但实现比较复杂

2.文件
通过文件传输比较简单,但效率差,而且高版本会受到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跨进程传递大数据内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Android跨进程传递大数据的方法实现

本文链接: https://www.lsjlt.com/news/121816.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android跨进程传递大数据的方法实现
    最近要从Service端给Client端传递图片数据,之前的数据都是通过aidl传递: 创建 Parcelable文件 ImageData.java public clas...
    99+
    2024-04-02
  • android跨进程共享数据怎么实现
    Android中跨进程共享数据可以使用以下方法实现:1. 使用Binder机制:Binder是Android中一种轻量级的进程间通信...
    99+
    2023-10-10
    android
  • c#跨窗体传递数据怎么实现
    在C#中,可以通过使用委托来实现跨窗体的数据传递。 首先,在发送数据的窗体中定义一个委托类型和事件,用于传递数据: public d...
    99+
    2024-03-02
    c#
  • C#线程传递参数实现方法
    这篇文章主要讲解了“C#线程传递参数实现方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#线程传递参数实现方法”吧!C#线程传递参数的实现是如何进行的呢?那么这里我们使用MyThread...
    99+
    2023-06-17
  • Android registerForActivityResult新用法实现两个Activity间数据传递
    目录前言startActivityForResult用法Activity Results API介绍registerForActivityResult()常规用法前言 今天在做项目...
    99+
    2023-05-14
    Android registerForActivityResult Activity间数据传递
  • android界面是如何进行数据传递的
    android界面是如何进行数据传递的?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。主界面:package com.yy.activity.value;import and...
    99+
    2023-05-31
    android roi %d
  • 小程序怎么实现跨页传递事件消息和数据
    本篇内容主要讲解“小程序怎么实现跨页传递事件消息和数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“小程序怎么实现跨页传递事件消息和数据”吧!一.需求分析此类需求大概意思是:A 页面进入 B 页...
    99+
    2023-06-26
  • 在Android中怎么实现与Activity的数据传递
    在Android中怎么实现与Activity的数据传递?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。使用Inten的putExtra传递第一个Activity中//创建意图对象...
    99+
    2023-05-31
    activity android roi
  • Android使用元数据实现配置信息的传递方法详细介绍
    目录前序一、在代码中获取元数据二、给应用页面注册快捷方式前序 格式 <meta-data android:name="weather" android:value="xxx"/...
    99+
    2024-04-02
  • vue组件间数据传递实现的方法是什么
    本篇内容主要讲解“vue组件间数据传递实现的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue组件间数据传递实现的方法是什么”吧!(1)props属性:在父组件中,可以通过子组件标签...
    99+
    2023-07-04
  • PHP 函数的参数传递方式如何处理大规模数据传递?
    函数参数传递方式对处理大规模数据至关重要。php 提供三种方式:1)传值传递:副本传递给函数,不影响原始变量;2)传址传递:传递原始变量的引用,函数中修改会影响原始变量;3)传引用传递:...
    99+
    2024-04-15
    php 大规模数据传递
  • android使用intent传递参数实现乘法计算
    本文实例为大家分享了android使用intent传递参数实现乘法计算的具体代码,供大家参考,具体内容如下 主界面上是两个EditText和一个按钮。用于输入两个数字参数。 calc...
    99+
    2024-04-02
  • Android应用中怎么实现Activity之间的数据传递
    本篇文章为大家展示了Android应用中怎么实现Activity之间的数据传递,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。MainActivitypublic class MainActivity...
    99+
    2023-05-31
    android roi activity
  • 小程序跨页面传递参数的几种方式
    当我们在开发小程序时,经常会遇到需要在不同页面之间传递数据的情况。为了实现页面间的数据传递,小程序提供了多种方法。下面将介绍几种常用的传递数据的方法。 URL参数传递:这是一种简单直接的传递数据的方式。在跳转页面时,可以在URL中添加参数来...
    99+
    2023-10-26
    小程序
  • JS跨域之window.name实现的跨域数据传输
    一、 window.name的性质 window.name有一个奇妙的性质,页面如果设置了window.name,那么在不关闭页面的情况下,即使进行了页面跳转location.hre...
    99+
    2024-04-02
  • vue数据传递的方法有哪些
    在Vue中,数据传递的方法有以下几种:1. 父子组件间的数据传递:通过父组件向子组件传递props属性,子组件通过props接收父组...
    99+
    2023-08-09
    vue
  • linux线程间传递数据的方法是什么
    在Linux中,线程间传递数据的方法有多种:1. 全局变量:线程可以通过访问共享的全局变量来传递数据。但是需要注意同步访问全局变量以...
    99+
    2023-09-26
    linux
  • php传递数据的方法有哪些
    这篇文章将为大家详细讲解有关php传递数据的方法有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。php提交数据有两种方式:get方式和post方式。一.通过get方式提交数据比如:https://ww...
    99+
    2023-06-14
  • 小程序实现页面跳转与数据传递方案
    目录页面跳转和数据传递wx的API跳转navigator组件(了解)总结页面跳转和数据传递 界面的跳转有两种方式:通过navigator组件 和 通过wx的API跳转 这里我们先以w...
    99+
    2024-04-02
  • 如何使用Vue进行数据传递(方法浅析)
    Vue是一个流行的JavaScript框架,它可以帮助我们构建高效的用户界面。在Vue中,有多种方法可以进行数据传递,这些方法可以应用于单个组件或整个Vue实例。本文将介绍如何使用Vue进行数据传递。PropsProps是Vue提供的一种属...
    99+
    2023-05-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作