日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bundle传递对象与Serializable、Parcelable接口理解和思考

發布時間:2023/12/19 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bundle传递对象与Serializable、Parcelable接口理解和思考 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

bundle.putSerializable 或者 bundle.putParcelable 傳進去的對象一定要implements?Parcelable 或者?Serializable 這兩個接口。

Serializable ?這個接口沒有具體的方法,這個關鍵字主要是標識這個類在jdk編譯的時候會被序列化處理。在序列化處理的過程中,會大量生成中間臨時變量。可能引起GC操作。

對于Parcelable 這個接口:


為什么有Serializable,有它就有反序列化,有一個問題:我這邊使用Java Serializable生成二進制文件,通過網絡傳輸到其他設備上,此設備是Linux,那么如何使用C語言將其方序列化,讀數據文件?能做到嗎?

Parcel的存在主要是jvm 進程之間的通信,進程是占有系統資源的最小程序,其包含一個或者多個線程。進程之間的通信,其可以上升到應用之間的通信,所以基于Parcel,android系統有Binder IPC進程通信機制和AIDL開發。什么是通信?

通信:1.共享數據或者傳遞數據 ? 2.通知對方調用自身的變量和代碼執行指令

為什么非要讓別人調用自己的資源執行自己的指令,比如:子線程要通知彈出窗口,那么自己不能做到,自己沒有window服務,只能讓UI線程去做。

為什么非要傳遞數據,直接讓數據的可見性(對象的可見性)讓兩個線程或者進程可見不就可以了嗎?可見性和生命周期直接相關的,可見性越大,那么生命周期越長。占內存!對于我們傳統的傳遞對象,就是將對象的可見性擴大,如下圖:


bundle在activity之間或者fragment之間使用Parcelable,Serializable傳遞對象是線程內部的數據交互,不屬于線程或者進程間的通信。

但是有一個問題:jvm線程內部傳遞對象為何不能直接傳,還需要序列化呢?但是handler傳遞消息是可以直接傳遞對象的。


Parcelable的使用:

publicclassDataBean implements Parcelable{

? // 寫數據進行保存
? ? @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);
? ? }
? ? // 讀數據進行恢復
? ? 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");

注意的問題:順序寫進去的數據,讀出來的時候也要按照這個順序,否則數據就會錯位。

為什么aidl或者IPC通信基于parcel:

從parcel的使用可以看出,parcel就是連續保存數據的單純地址結構,它和jvm中的對象的結構有很大的不同。對于android系統,其應用都是跑在jvm上的,那么各個進程也是跑在j各個獨立的vm上的,進程之間的通信是跨jvm,那么必然數據先是從一個jvm到普通Linux(android系統基于Linux內核)管理的內存,然后再讀到另外的jvm中。那么不可能直接傳遞普通的Java對象,Java對象只有jvm才有的概念。parcel類似于基本數據的集合,對于傳統的系統都是可以管理的。

對于windows系統,進程之間通信完全可以傳指針或者數據結構,因為應用之間沒有虛擬機的壁壘,大家都是直接和操作系統打交道。



? ? ?



總結

以上是生活随笔為你收集整理的bundle传递对象与Serializable、Parcelable接口理解和思考的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。