編輯:關於Android編程
在Android中,對象是實現序列化之前是無法直接作為Intent參數在Activity之間傳遞的。
Android中對象序列化可以通過實現Serializable接口或者實現Parcelable接口。接下來,我會介紹一下實現這兩個接口的方法以及如何在這兩者之間進行選擇。
Serializable是一個標記接口,意味著它沒有需要實現的方法。因為對象再實現Serializable接口的時候,只需要簡單的implements即可。
示例代碼如下:
package com.example.photocrop.model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class PersonSerializable implements Serializable {
private static final long serialVersionUID = -1535959029658501338L;
private String name;
private String sex;
private int age;
private List skills = new ArrayList();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List getSkills() {
return skills;
}
public void setSkills(List skills) {
this.skills = skills;
}
}
在Activity-1中傳遞PersonSerializable的代碼如下:
private PersonSerializable generatePerson() {
PersonSerializable ps = new PersonSerializable();
ps.setAge(27);
ps.setName(wangzhengyi);
ps.setSex(boy);
ps.setSkills(new ArrayList(Arrays.asList(c, c++, java, php)));
return ps;
}
private void startActivity2() {
PersonSerializable ps = generatePerson();
Intent intent = new Intent(this, Activity2.class);
intent.putExtra(person, ps);
startActivity(intent);
}
在activity-2中接收PersonSerializable對象:
Intent intent = getIntent();
PersonSerializable ps = (PersonSerializable)intent.getSerializableExtra(person);
Log.e(wangzhengyi, person name : + ps.getName());
Log.e(wangzhengyi, persion age : + ps.getAge());
實現Parcelable接口主要需要如下幾個步驟:
實現describeContents方法。內容接口描述,默認返回0即可。 實現writeToParcel方法。傳遞數據到Parcel容器中。 創建一個Parcelable.Creator接口的實例,用於讀取Parcel容器中的數據。示例代碼如下:
package com.example.photocrop.model;
import java.util.ArrayList;
import java.util.List;
import android.os.Parcel;
import android.os.Parcelable;
public class PersonParcelable implements Parcelable{
private String name;
private String sex;
private int age;
private List skills = new ArrayList();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List getSkills() {
return skills;
}
public void setSkills(List skills) {
this.skills = skills;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(getName());
dest.writeString(getSex());
dest.writeInt(getAge());
dest.writeList(getSkills());
}
public void readFromParcel(Parcel source) {
setName(source.readString());
setSex(source.readString());
setAge(source.readInt());
source.readList(skills, List.class.getClassLoader());
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
@Override
public PersonParcelable createFromParcel(Parcel source) {
// 從Parcel容器中讀取傳遞數據值,封裝成Parcelable對象返回邏輯層。
PersonParcelable pp = new PersonParcelable();
pp.readFromParcel(source);
return pp;
}
@Override
public PersonParcelable[] newArray(int size) {
// 創建一個類型為T,長度為size的數組,僅一句話(return new T[size])即可。方法是供外部類反序列化本類數組使用。
return new PersonParcelable[size];
}
};
}
在activity-1中傳遞PersonParcelable對象:
private PersonParcelable generatePerson() {
PersonParcelable pp = new PersonParcelable();
ps.setAge(27);
ps.setName(wangzhengyi);
ps.setSex(boy);
ps.setSkills(new ArrayList(Arrays.asList(c, c++, java, php)));
return pp;
}
private void startActivity2() {
PersonParcelable pp = generatePerson();
Intent intent = new Intent(this, Activity2.class);
intent.putExtra(person, ps);
startActivity(intent);
}
在activity-2中接收PersonParcelable對象:
Intent intent = getIntent();
PersonParcelable pp = (PersonParcelable) intent.getParcelableExtra(person);
Log.e(wangzhengyi, person name : + pp.getName());
Log.e(wangzhengyi, persion age : + pp.getAge());
for (String skill : pp.getSkills()) {
Log.e(wangzhengyi, skill: + skill);
}
主要的區別如下:
Serializable實現簡單,不需要任何額外的序列化操作。而Parcelable實現較為復雜,有特定的接口和對象句柄需要實現。 Serializable在序列化的時候會產生大量的臨時變量,從而引起頻繁的GC,而相比之下Parcelable的性能更高(號稱10倍優於Serializable),所以當在使用內存時(如:序列化對象在網絡中傳遞對象或序列化在進程間傳遞對象),更推薦使用Parcelable接口。 Parcelable有個明顯的缺點:不能使用在要將數據存儲在磁盤上的情況(如:永久性保存對象,保存對象的字節序列到本地文件中),因為Parcel本質上為了更好的實現對象在IPC間傳遞,並不是一個通用的序列化機制,當改變任何Parcel中數據的底層實現都可能導致之前的數據不可讀取,所以此時還是建議使用Serializable 。
帶觸控的圖表類,後期會把這個功能類,添加到這個框架裡:效果如下public class BaseFundChartView extends View implements
表情與鍵盤的切換輸入大部分IM都會需要到,之前自己實現了一個,還是存在些缺陷,比如說鍵盤與表情切換時出現跳閃問題,這個困擾了我些時間,不過所幸在Github(其代碼整體結
之前的幾篇博客,我測試了View事件分發機制中的一些知識點,我們理解事件分發機制的目的就是為了能夠更好了知道View中事件的傳遞過程進而能夠對於滑動沖突有針對性的解決措施
現在就來學習一下sqlite是如何進行數據存儲並且像其他數據庫那樣實現增刪改查的相信並不是每個人都非常的熟悉sql語句,所以android也向我們對數據庫的增刪改查提供了