浅谈跨进程传递的数据

谈及android跨进程数据传递,脑袋中不乏浮现出ContentProvider、AIDL、 Messenger、Intent等,对,的确这些都可以实现,但今天我们不谈这些,仅注重于数据。跨进程传递数据,常需要序列化操作,也许初次接触序列化这个名词,可能大家会觉得很抽象,其实,可以把其想象成一个吹气球的过程,序列化就是把一个吹好的气球放掉气,反序列化就是把一个放了气的气球重新吹起来,这样一说,是不是好懂很多。


目前android支持有两个接口可实现序列化操作(Serializable 和 Parcelable),只要我们实现了它们其中一个,就可以轻松地实现数据的传递,对常用的数据类型即AIDL传递支持的类型,通过Android Studio就可以自动生成(CharSequence例外),也不需要我们去实现序列化接口,因此对其也不需赘述。先重点关注AIDL传递自定义对象,对此,一般需要我们主动去实现Parcelable,只要自定义的对象没有包含复杂的属性,一般操作起来还是十分快捷。一般步骤是:

Step1:判断成员属性是不是AIDL传递支持的类型,不是则跳Step2,否则跳转Step3;

Step2:判断成员属性是不是实现了Parcelable接口,不是则跳转Step1,否则跳Step3;

Step3:撰写Write和read方法,分别对应气球放气和吹气的过程;

注意:对属性进行write和read操作一定要顺序一致,否则就会报错

 

好了,有了这个步骤,写起来代码来也就底气十分,按图索骥即可。最近我碰到个问题,如何传递SparseArrayCompat<E>和嵌套的集合类(如:List< List<E> >),初次面对这个问题,一般在想AIDL不支持这些类型呀,尽管E实现了Parcelable,但是SparseArrayCompat<E>作为一个整体还是不支持呀,怎么办呢?瞬间进入死胡同不能自拔!

N久之后,灵光一闪,序列化不就是放弃和吹气的过程吗,貌似没有强制说SparseArrayCompat<E>就一定要以SparseArrayCompat<E>类型传递吧,只要我能放掉气,又能吹起来不就可以了吗?以String类型为例,下面代码就产生了:

read代码:

public SparseArrayCompat<String> readSparseArrayCompat(Parcel in){
        SparseArrayCompat<String> data = new SparseArrayCompat<>();
        int size = in.readInt();
        for(int i = 0;i<size;++i){
            Integer key = in.readInt();
            String value = in.readString();
            data.put(key,value);
        }
        return data;
    }

write代码:

public void writeSparseArrayCompat(Parcel dest,SparseArrayCompat<String> data) {
        if (data == null || data.size() <= 0) return;
        int size = data.size();
        dest.writeInt(size);
        for (int i = 0; i < size; ++i) {
            dest.writeInt(data.keyAt(i));
            dest.writeString(data.valueAt(i));
        }
    }

说了这么多,其实也就是想说明这么一点:换种思路海阔天空



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值