1. 程式人生 > >bundle傳遞物件與Serializable、Parcelable介面理解和思考

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傳遞物件SerializableParcelable介面理解思考

bundle.putSerializable 或者 bundle.putParcelable 傳進去的物件一定要implements Parcelable 或者 Serializable 這兩個介面。 Serializable  這個介面沒有具體的方法,這個關鍵字主要是標識

Android中如何使用Intent在Activity之間傳遞物件[使用Serializable或者Parcelable]

      在Android中的不同Activity之間傳遞物件,我們可以考慮採用Bundle.putSerializable(Key,Object);也可以考慮採用Bundle.putParcelable(Key, Object);其中前面一種方法中的Object要實現Se

FC 13.2 使用Intent傳遞物件SerializableParcelable

使用Intent的putExtra方法可以傳遞資料,但是不能直接來傳遞自定義的物件。接下來學習兩種床底物件的方式 Serializable方式 Parcelable方式 兩種方式的詳細講解   Serializable方式 Serializable是序

Activity Service 實現Parcelable介面傳遞 ArrayList 集合

在 Activity 跟 Service 的通訊過程中,一般用來傳遞資料的載體就是Intent了,一般用來傳資料呢,我們都是通過putExtra 函式來傳遞簡單的String,int, long型別的值, 但是現在存在這樣一個問題: 1)在Activity裡面有一個歌曲列表

android activity之間傳遞物件Serializable Parcelable

Android中Intent中傳遞物件的方法, 一種是Bundle.putSerializable(Key,Object); 另一種是Bundle.putParcelable(Key, Object); 當然這些Object是有一定的條件的,前者是實現了Serializa

Thinking in java自讀筆記:傳遞物件克隆

前提:對於常規資料型別而言,可以分為值型別和引用型別,值型別為我們常說的”主型別”,”值型別”直接將記憶體儲存在棧內,由系統自動釋放資源的資料型別;引用型別是由型別的實際值引用(類似於指標)表示的資料型別,即一個在棧上的引用指向一個在堆上的例項的型別。 一.值的傳遞 當將應用型別和值

javaScript複習(六)Math物件MathAPI Date物件DateAPI

Math: 專門執行數學計算的物件,封裝了數學計算中常用的常量 1. 取整:3種:                 上取整: Math.c

構建環境域用戶

構建與環境、域用戶和組構建與環境、域用戶和組一、構建域環境1、域和域控制器(1)域:將網絡中的計算機邏輯上組織到一起,進行集中管理,這種集中管理的環境稱為域。(2)域控制器(DC):在域中,至少有一臺域控制器,域控制器中保存著整個域的用戶帳號和安全數據庫,安裝了活動目錄的一臺計算機稱為域控制器,域管理員可以控

IntegerintString物件字串之間的"=="equals情況

一、Integer與int ①程式碼 @Test public void testInteger() { int i = 129; int j = 129; Integer m = 128; Integer n

Linux中執行緒的同步互斥生產者消費模型讀者寫者問題死鎖問題

執行緒的同步與互斥 執行緒是一個存在程序中的一個執行控制流,因為執行緒沒有程序的獨立性,在程序內部執行緒的大部分資源資料都是共享的,所以在使用的過程中就需要考慮到執行緒的安全和資料的可靠。不能因為執行緒之間資源的競爭而導致資料發生錯亂,也不能因為有些執行緒因為

CStringstringchar*的區別轉換

我們在C++的開發中經常會碰到string、char*以及CString,這三種都表示字串型別,有很多相似又不同的地方,常常讓人混淆。下面詳細介紹這三者的區別、聯絡和轉換:各自的區別char*:char*是一個指向字元的指標,是一個內建型別。可以指向一個字元,也可以表示字元陣

PHP介面抽象類繼承的理解應…

幾個問題全是關於介面,介面有什麼用?為什麼要用介面?什麼時候該使用介面?很慶幸他們不是問我Java如何連線SQL Server,或者是如何開發J2EE,這類問題有殺傷力,避之則吉。今年計算機學院本科有個畢業設計課題是做J2ME,選這個題目的學生在5月末都還在苦著臉研究java.util.*這個包,這個這個唉

ES6語法(2)—— 物件解構賦值箭頭函式使用思考

    ES6的內容太過豐富,在學習的過程中,我選擇取其精華,跳過非精華,個人覺得變數的解構賦值和箭頭函式都是非常有實際使用價值的內容,就單獨拿出來放一個章節分析和介紹。     關於變數的解構賦值,其實有很多種解構方式,包括陣列,物件,字串等都可以進行解構賦值,但個人認為

parseIntparseFloat如何區分整數小數

如果字串中含有非數字的情況,就不能使用Namber()方法來進行轉換。 parseInt() 不認識小數點 parseInt():是從左到右一個一個解析,看到數字就通過,非數字就停止解析。 var a = '00000100px'; alert(p

Docker映象容器的理解使用方法

零、應用背景 先看下面2個問題: 1. 單機多系統。如:windows上跑linux、VPS服務、PaSS服務。 windows上跑linux,一般用VM技術實現。 VPS提供商需要將一臺機器劃分成多

神經網路中EpochIterationBatchsize相關理解說明

看了半年論文,對這三個概念總是模稜兩可,不是很清楚。所以呢!我就花了半天時間,收集網上寫的很好的關於這三個概念的介紹,把他們總結到一起,希望能對大家有幫助!batchsize:中文翻譯為批大小(批尺寸)。簡單點說,批量大小將決定我們一次訓練的樣本數目。batch_size將影

談一下我對如何設計微服務介面理解思考

一、 概述 微服務是一個獨立執行、自帶資料儲存管理,對外提供介面的自治系統。微服務設計很關鍵的一點是微服務介面的設計。不同微服務經常是分配給不同的團隊開發的,介面是各團隊程式設計的契約。 下面只討論微服務間介面的設計,至於微服務內部子模組間介面的設計比較

Git | 一篇文章搞定GitGitHub的理解使用(學習筆記)

Git learning note 本筆記整理自廖雪峰老師的Git教程,加上了自己的實踐結果和一些理解,旨在使科研工作者(基本上是獨立開發的那種)看完就能理解和使用Git。廖老師的教程生動活潑,條理清晰,推薦閱讀。還可以贊助哦。 目錄 Git 簡

Redis——2API的理解使用——2.5有序集合

有序集合相對於雜湊、列表、集合來說會有一點點陌生,但既然叫有序集合,那麼它和集合必然有著聯絡,它保留了集合不能有重複成員的特性,但不同的是,有序集合中的元素可以排序。但是它和列表使用索引下標作為排序依據不同的是,它給每個元素設定一個分數(score)作為排序的依據。如圖2-2

Intent傳遞物件——SerializableParcelable區別

Intent在不同的元件中傳遞物件資料的應用非常普遍。下面介紹兩種通過Intent傳遞物件的方法。 1、實現Serializable介面 2、實現Parcelable介面 為什麼要將物件序列化?  1、永久性儲存物件,儲存物件的位元組序列到本地檔案中;  2、用