bundle传递对象与Serializable、Parcelable接口理解和思考
bundle.putSerializable 或者 bundle.putParcelable 傳進去的對象一定要implements?Parcelable 或者?Serializable 這兩個接口。
Serializable ?這個接口沒有具體的方法,這個關鍵字主要是標識這個類在jdk編譯的時候會被序列化處理。在序列化處理的過程中,會大量生成中間臨時變量。可能引起GC操作。
對于Parcelable 這個接口:
為什么有Serializable,有它就有反序列化,有一個問題:我這邊使用Java Serializable生成二進制文件,通過網(wǎng)絡傳輸?shù)狡渌O備上,此設備是Linux,那么如何使用C語言將其方序列化,讀數(shù)據(jù)文件?能做到嗎?
Parcel的存在主要是jvm 進程之間的通信,進程是占有系統(tǒng)資源的最小程序,其包含一個或者多個線程。進程之間的通信,其可以上升到應用之間的通信,所以基于Parcel,android系統(tǒng)有Binder IPC進程通信機制和AIDL開發(fā)。什么是通信?
通信:1.共享數(shù)據(jù)或者傳遞數(shù)據(jù) ? 2.通知對方調用自身的變量和代碼執(zhí)行指令
為什么非要讓別人調用自己的資源執(zhí)行自己的指令,比如:子線程要通知彈出窗口,那么自己不能做到,自己沒有window服務,只能讓UI線程去做。
為什么非要傳遞數(shù)據(jù),直接讓數(shù)據(jù)的可見性(對象的可見性)讓兩個線程或者進程可見不就可以了嗎?可見性和生命周期直接相關的,可見性越大,那么生命周期越長。占內存!對于我們傳統(tǒng)的傳遞對象,就是將對象的可見性擴大,如下圖:
bundle在activity之間或者fragment之間使用Parcelable,Serializable傳遞對象是線程內部的數(shù)據(jù)交互,不屬于線程或者進程間的通信。
但是有一個問題:jvm線程內部傳遞對象為何不能直接傳,還需要序列化呢?但是handler傳遞消息是可以直接傳遞對象的。
Parcelable的使用:
publicclassDataBean implements Parcelable{
? // 寫數(shù)據(jù)進行保存
? ? @Override
? ? public void writeToParcel(Parcel dest, int flags) {
? ? ? ? dest.writeInt(this.id);
? ? ? ? dest.writeString(this.Account);
? ? ? ? dest.writeString(this.name);
? ? ? ? dest.writeString(this.password);
? ? ? ? dest.writeInt(this.kind);
? ? ? ? dest.writeString(this.desc);
? ? }
? ? // 讀數(shù)據(jù)進行恢復
? ? protected DataBean(Parcel in) {
? ? ? ? this.id = in.readInt();
? ? ? ? this.kind = in.readInt();
? ? ? ? this.password = in.readString();
? ? ? ? this.name = in.readString();
? ? ? ? this.Account = in.readString();
? ? ? ? this.desc = in.readString();
? ? }
intent.putExtra("data",data);
DataBean data = getIntent().getParcelableExtra("data");
注意的問題:順序寫進去的數(shù)據(jù),讀出來的時候也要按照這個順序,否則數(shù)據(jù)就會錯位。
為什么aidl或者IPC通信基于parcel:
從parcel的使用可以看出,parcel就是連續(xù)保存數(shù)據(jù)的單純地址結構,它和jvm中的對象的結構有很大的不同。對于android系統(tǒng),其應用都是跑在jvm上的,那么各個進程也是跑在j各個獨立的vm上的,進程之間的通信是跨jvm,那么必然數(shù)據(jù)先是從一個jvm到普通Linux(android系統(tǒng)基于Linux內核)管理的內存,然后再讀到另外的jvm中。那么不可能直接傳遞普通的Java對象,Java對象只有jvm才有的概念。parcel類似于基本數(shù)據(jù)的集合,對于傳統(tǒng)的系統(tǒng)都是可以管理的。
對于windows系統(tǒng),進程之間通信完全可以傳指針或者數(shù)據(jù)結構,因為應用之間沒有虛擬機的壁壘,大家都是直接和操作系統(tǒng)打交道。
? ? ?
總結
以上是生活随笔為你收集整理的bundle传递对象与Serializable、Parcelable接口理解和思考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 监控摄像200万像素够用吗
- 下一篇: NASA 韦伯太空望远镜发现一颗蕴含水蒸