1. 程式人生 > >activity之間傳值,解決:Parcelable encountered IOException writing serializable object異常

activity之間傳值,解決:Parcelable encountered IOException writing serializable object異常

今天寫程式碼的時候遇到了兩個activity之間需要傳資料,本來是一件非常簡單的事情

平常都是使用 intent.putExtra(type,value);就沒問題了。

傳物件的話就需要實現序列化介面了就行了。

為什麼要實現序列化介面,你可以當這個是android的一個機制,就是得這麼辦,不這麼辦不行。

實際上實現序列化介面就是為了讓資料能變成一種可儲存或可傳輸的狀態,可以傳輸到網路,也可以傳輸到本地。所以activity之間,你要是不實現序列化介面,那麼你在SecondActivity中操作FirstActivity中的資料必將會導致記憶體洩露。

java中的實現序列化的方式有兩種

1實現Serializable介面 

2.實現Parcelable 介面

關於這兩個介面的區別呢,在這裡正好回憶一下吧

從寫程式碼上來說:

Serializable:實現這個非常簡單,直接 implement 就完了,什麼都不用寫,當然 你要是想寫,宣告一個 serialVersionUID 變數 就ok了,

serialVersionUID  的話 Android Studio 預設是不會自動生成的,你需要配置一下:

File -> Settings -> Editor -> Inspections -> Java -> Serialization issues -> Serializable class without 'serialVersionUID' 勾上 然後 apply 、ok 就好了。

程式碼上實現Serialazable就是這麼的簡單

Parcelable:這個的話就有點複雜了,你需要 implement 這個 介面 然後 重寫 

構造方法 (傳入Parcel物件)

descirbeContents方法 

writeToParcel方法 

建立一個Parcelable.Creator物件

Android Studio 有 生成Parcelable的外掛 可以直接匯入外掛:File -> Setting -> Plugins -> Browse Respositories 然後搜尋 Parcelable 安裝

,就可以直接在model裡一鍵匯入Parcelable介面了,可以省去很大一部分時間

從實際使用角度上來看:

1.使用記憶體的使用,Parcelable比Serializable效能高

2.Serializable在序列化時會產生大量的臨時變數,引起頻繁GC

3.Parcelable不能使用在要將資料儲存在磁碟的情況,因為Parcelable不能很好的保證資料的持續性在外界有變化的情況下。

具體使用還是看自己的需求吧

下面說一下自己的錯誤。。

從網路上得到的資料 然後 我實現了Serializable介面 傳遞到第二個activity中,結果突然給我報了一個:Parcelable encountered IOException writing serializable object

然後檢視自己的程式碼,發現並沒有實現Parcelable介面啊,然後想到以前好像見過這個異常,是因為內部分沒有實現Serializable介面,但是回到程式碼一看,雖然有內部類,但是我也實現了Serializable介面了啊,為什麼還會報這個異常呢?!!!

。。。。。

然後找了好久才發現是因為自己的model類中有一個Bitmap物件,,這個物件本身已經實現了Parcelable介面。。所以才會出現那個異常,然後直接把類改為實現Parcelable介面,然後執行,果然好了。

對了,我們最好不要直接傳Bitmap物件,因為如果Bitmap尺寸過大的話就會引起崩潰,以前試過應該是大於512k就會crash掉。所以我們最好把Bitmap快取下來直接傳路徑就可以了