av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android跨進(jìn)程傳遞大數(shù)據(jù)的方法實(shí)現(xiàn)

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

最近要從Service端給Client端傳遞圖片數(shù)據(jù),之前的數(shù)據(jù)都是通過(guò)aidl傳遞:

創(chuàng)建 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);}

運(yùn)行報(bào)錯(cuò):

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)...

原因

這里導(dǎo)致DeadObjectException的原因主要是binder創(chuàng)建的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 }

傳輸中如果數(shù)據(jù)大于free_buffers,則會(huì)拋出DeadObjectException

解決

1.socketsocke傳輸不受大小限制,但實(shí)現(xiàn)比較復(fù)雜

2.文件通過(guò)文件傳輸比較簡(jiǎn)單,但效率差,而且高版本會(huì)受到Android系統(tǒng)權(quán)限限制

3.數(shù)據(jù)切割將較大數(shù)據(jù)切割成較小的數(shù)據(jù)傳輸,此方法是兼顧效率,復(fù)雜度較好的方案

定義數(shù)據(jù)體:

public class SliceData implements Parcelable { private byte[] data; private int length; ...}

切割數(shù)據(jù)方法:

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按順序構(gòu)建發(fā)送:

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) {//最后一個(gè)數(shù)據(jù)塊 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,可以利用實(shí)現(xiàn)mmap的框架,比如 MMKV

5.Bitmap如果傳輸?shù)臄?shù)據(jù)是Bitmap,還可以用Bundle的putBinder方案定義binder:

class ImageBinder extends IRemoteGetBitmap.Stub { @Override public Bitmap getBitMap() throws RemoteException { return mBitmap; }}

發(fā)送

Bundle bundle = new Bundle();bundle.putBinder('bitmap', new ImageBinder());intent.putExtras(bundle);

接收:

ImageBinder imageBinder = (ImageBinder) bundle.getBinder('bitmap');Bitmap bitmap = imageBinder.getBitmap();

到此這篇關(guān)于Android跨進(jìn)程傳遞大數(shù)據(jù)的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Android跨進(jìn)程傳遞大數(shù)據(jù)內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 欧美成人激情 | 国产日韩视频 | 国产在线激情视频 | 一区二区在线看 | 国产美女特级嫩嫩嫩bbb片 | 91中文字幕在线观看 | 日韩免费av| 久久精品男人的天堂 | 国产一区中文字幕 | 欧美日本在线观看 | 久久亚洲国产精品日日av夜夜 | 国产成人免费视频网站高清观看视频 | 玖玖色在线视频 | 国产成人精品a视频 | 日日网| 97人人澡人人爽91综合色 | 久久美国 | 精品国产一区二区三区性色av | 网站黄色在线免费观看 | 中国大陆高清aⅴ毛片 | 91伊人 | 在线观看中文字幕视频 | 国产视频福利在线观看 | 色婷婷av一区二区三区软件 | 国产精品片 | av大全在线 | 日韩精品1区2区3区 爱爱综合网 | 精品久久一区 | 一级a性色生活片久久毛片波多野 | 久久久久国产一区二区三区 | 亚洲自拍偷拍免费视频 | 91精品国产91久久久久久吃药 | 成人在线视频免费播放 | 9色网站 | a级黄色片在线观看 | 97精品一区二区 | 国产中文字幕av | 日韩一区在线观看视频 | 日韩视频91 | 久草网址| 精品96久久久久久中文字幕无 |