色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

Android跨進程傳遞大數據的方法實現

瀏覽:3日期:2022-09-20 15:25:38

最近要從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.aidlinterface test { void sendMessage(ImageData data);}

運行報錯:

android.os.DeadObjectException: Transaction failed on small parcel; remote process probably diedat 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 spacen',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.socketsocke傳輸不受大小限制,但實現比較復雜

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);//64kfor (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跨進程傳遞大數據內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
主站蜘蛛池模板: 久久成人国产精品 | 欧美猛交xxxx免费看 | 日本精品中文字幕有码 | 久久国产精品夜色 | 欧美激情伦妇在线观看 | 夜夜春夜夜夜夜猛噜噜噜噜噜 | 国产激情一区二区三区成人91 | 久99频这里只精品23热 视频 | 欧美成人aaa大片 | 日韩在线一区二区三区视频 | 一级做a爰片久久毛片潮喷 一级做a爰片久久毛片美女 | 久青草国产97香蕉在线视频xx | 亚洲rct中文字幕在线 | 性欧美高清极品xx | 国产精品国三级国产aⅴ | 国产自产自拍 | 牛牛本精品99久久精品88m | 亚洲伊人成人 | 一级做性色a爰片久久毛片 一级做性色a爰片久久毛片免费 | 欧毛片 | 成人观看网站a | 亚洲精品国产一区二区三 | 91国语对白 | 国产欧美另类久久精品91 | 欧美13一14周岁a在线播放 | 成人欧美日韩视频一区 | 久久久婷 | 韩国毛片一级 | 韩国成人毛片aaa黄 韩国福利一区 | 亚洲在线视频一区 | 在线播放免费一级毛片欧美 | 中日韩精品视频在线观看 | 九色视频在线观看免费 | 97在线视频精品 | 99精品免费在线观看 | 欧美激情精品久久久久久久久久 | a毛片基地免费全部香蕉 | 亚洲精品99久久久久中文字幕 | 国产成人91高清精品免费 | 日韩在线精品 | 精品成人在线观看 |