浅谈跨进程传递的数据

谈及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));
        }
    }

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章