編輯:關於Android編程
上一篇文章中我們講解了android app中的升級更新操作,app的升級更新操作算是App的標配了,升級操作就是獲取App的升級信息,更新操作是下載,安裝,更新app,其中我們既可以使用app store獲取應用的升級信息,也可以在應用內通過請求本地服務器獲取應用的升級信息,並通過與本地app的版本號對比判斷應用是否需要升級。
升級信息是app更新的基礎,只有我們的app的升級信息指明需要更新,我們才可以開始後續的更新操作–也就是下載安裝更新app。這裡強調一點的是應用的升級操作分為普通的升級和強制升級兩種,普通的升級操作就是完成一次對app的更新操作,而強制更新是在線上的app出現bug 的時候一種強制用戶升級的手段,用戶體驗不太好,所以一般不太建議使用這種方式升級用戶的app。本文將講解android中數據傳輸中需要了解的數據序列化方面的知識,我們知道android開發過程中不同Activity之間傳輸數據可以通過Intent對象的put**方法傳遞,對於java的八大基本數據類型(char int float double long short boolean byte)傳遞是沒有問題的,但是如果傳遞比較復雜的對象類型(比如對象,比如集合等),那麼就可能存在問題,而這時候也就引入了數據序列化的概念。
序列化的定義:
這裡我們先看一下呢序列化在百科上的定義
序列化 (Serialization)將對象的狀態信息轉換為可以存儲或傳輸的形式的過程。在序列化期間,對象將其當前狀態寫入到臨時或持久性存儲區。以後,可以通過從存儲區中讀取或反序列化對象的狀態,重新創建該對象。
簡單來說就是我們的數據在傳輸的時候需要將信息轉化為可以傳輸的數據,然後在傳輸的目標方能夠反序列化將數據還原回來,這裡的將對象狀態信息轉換為可傳輸數據的過程就是序列化,將可傳輸的數據逆還原為對象的過程就是反序列化。
為什麼需要序列化:
知道前面的序列化定義,內存對象什麼需要實現序列化呢?
永久性保存對象,保存對象的字節序列到本地文件。
通過序列化對象在網絡中傳遞對象。
通過序列化對象在進程間傳遞對象。
實現序列化的兩種方式:
那麼我們如何實現序列化的操作呢?在android開發中我們實現序列化有兩種方式:
實現Serializable接口
實現parcelable接口
兩種序列化方式的區別:
都知道在android studio中序列化有兩種方式:serializable與parcelable。那麼這兩種實現序列化的方式有什麼區別呢?下面是這兩種實現序列化方式的區別:
Serializeble是java的序列化方式,Parcelable是android特有的序列化方式;
在使用內存的時候,Parcelable比Serializable性能高,所以推薦使用Parcelable。
Serializable在序列化的時候會產生大量的臨時變量,從而引起頻繁的GC。
Parcelable不能使用在要將數據存儲在磁盤上的情況,因為Parcelable不能很好的保證數據的持續性在外界有變化的情況下。盡管Serializable效率低點, 也不提倡用,但在這種情況下,還是建議你用Serializable。
最後還有一點就是Serializeble序列化的方式比較簡單,直接集成一個接口就好了,而parcelable方式比較復雜,不僅需要集成Parcelable接口還需要重寫裡面的方法。
對象實現序列化的實例:
通過實現Serializable接口實現序列化:
上面介紹了那麼多概念上的知識,下面我們就具體看一下如何通過這兩種方式實現序列化,我們首先看一下如何通過實現Serializable接口實現序列化,通過實現Serializable接口實現序列化,只需要簡單的實現Serialiizable接口即可。通過實現Serializable接口就相當於標記類型為序列化了,不需要做其他的操作了。
/**
* Created by aaron on 16/6/29.
*/
public class Person implements Serializable{
private int age;
private String name;
private String address;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
可以發現我們定義了一個普通的實體Person類,並設置了三個成員屬性以及各自的set,get方法,然後我們就只是簡單的實現了Serializable接口就相當於將該類序列化了,當我們在程序中傳輸該類型的對象的時候就沒有問題了。
通過實現Parcelable接口實現序列化:
然後我們在看一下通過實現Parcelable接口來實現序列化的方式,通過實現Parcelable接口實現序列化相當於實現Serialiable接口稍微復雜一些,因為其需要實現一些特定的方法,下面我們還是以我們定義的Person類為例子,看一下如果是實現Parcelable接口具體是如何實現的:
/**
* Created by aaron on 16/6/29.
*/
public class Person implements Parcelable{
private int age;
private String name;
private String address;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.age);
dest.writeString(this.name);
dest.writeString(this.address);
}
public Person() {
}
protected Person(Parcel in) {
this.age = in.readInt();
this.name = in.readString();
this.address = in.readString();
}
public static final Creator CREATOR = new Creator() {
@Override
public Person createFromParcel(Parcel source) {
return new Person(source);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
}
可以發現當我們通過實現Parcelable接口實現序列化還需要重寫裡面的成員方法,並且這些成員方法的寫法都比較固定。
實現Parcelable序列化的android studio插件:
順便說一下最近發現一個比較不錯的Parcelable序列化插件。下面就來看一下如何安裝使用該插件。
打開android studio –> settings –> Plugins –> 搜索Parcelable –> Install –> Restart,這樣安裝好了Parcelable插件; 然後在源文件中右鍵 –> Generate… –> Parcelable 點擊Parcelable之後可以看到,源文件中已經實現了Parcelable接口,並重寫了相應的方法:這樣我們就安裝好Parcelable插件了,然後當我們執行Parcelable操作的時候就重寫了Parcelable接口的相應序列化方法了。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxzdHJvbmc+19y94aO6PC9zdHJvbmc+PC9wPg0KPHA+v8nS1M2ouf3Ktc/WU2VyaWFsaXphYmxlus1QYXJjZWxhYmxlvdO/2rXEt73Kvcq1z9bQ8sHQu688L3A+DQo8cD7Ktc/WU2VyaWFsaXphYmxlvdO/2srHamF2YdbQyrXP1tDywdC7r7XEt73KvaOstvjKtc/WUGFyY2VsYWJsZcrHYW5kcm9pZNbQzNjT0LXEyrXP1tDywdC7r7XEt73KvaOsuPzKyrrPYW5kcm9pZLu3vrM8L3A+DQo8cD7Ktc/WU2VyaWFsaXphYmxlvdO/2ta70OjSqsq1z9a4w73Tv9q8tL/Jzt7Q6Mbky/uy2df3o6y2+Mq1z9ZQYXJjZWxhYmxlvdO/2tDo0qrW2NC0z+DTprXEt723qDwvcD4NCjxwPmFuZHJvaWQgc3R1ZGlv1tDT0Mq1z9ZQYXJjZWxhYmxlvdO/2rXEz+DTprLlvP6jrL/JsLLXsLjDsuW8/rrct72x47XEyrXP1lBhcmNlbGFibGW907/ao6zKtc/W0PLB0LuvPC9wPg0KPGhyIC8+DQo8cD48c3Ryb25nPrG+zsTS1M2ssr3WwWdpdGh1YtbQo7o8YSBocmVmPQ=="https://github.com/yipianfengye/androidProject">https://github.com/yipianfengye/androidProject,歡迎star和follow
前言Android中有許多的數據存儲方式,如果我們有少量的數據需要存儲,那麼使用:SharedPreferences、文件存儲就可以了。但是如果有大量數據需要進行讀寫,那
在開發中,我們常常用打印log的方式來調試我們的應用。在Java中我們常常使用方法System.out.println()來在控制台打印日志,以便我們
一、Git 與GitHub這裡首先介紹下Git與GitHub是什麼東西,他們之間有何區別呢?Git :分布式版本控制系統,最初用在Linux上,可以和SVN、CVS等作為
本文只是寫了如何配置JDK,以及adt-bundle的配置。對於以前的adt-bundle的版本,會自帶CPU/ABI系統鏡像,經過本文所描述的兩個步驟後可以直接創建AV