android java 实体类 object变量 保存_Android中Intent传递对象的两种方法Serializable,Parcelable...
Android中的傳遞有兩個方法,一個是Serializable,另一個是Parcelable。
Serializable是J2SE本身就支持的。而Parcelable是Android所特有的。
二者的使用場景和區別:
1)在使用內存的時候,Parcelable比Serializable性能高,所以推薦使用Parcelable。
2)Serializable在序列化的時候會產生大量的臨時變量,從而引起頻繁的GC。
3)Parcelable不能使用在要將數據存儲在磁盤上的情況,因為Parcelable不能很好的保證數據的持續性在外界有變化的情況下。盡管Serializable效率低點,但此時還是建議使用Serializable 。
Serializable接口實現比較簡單,只要實現setter和getter,就可以了。
而Parcelable實現比較麻煩些。用一個小的demo來說明:
1.新建android項目ObjectTranDemo
2.創建一個entity的javaBean:Person.java.實現Serializable接口
package com.example.objecttrandemo;
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = -7060210544600464481L;
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
3.創建主界面activity_main.xml:
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="android object trance"
/>
android:id="@+id/button1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Serializable"
/>
android:id="@+id/button2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Parcelable"
/>
4.創建主activity。這個activity主要用來響應點擊事件,和傳遞數據。ObjecttranDemo.java:
package com.example.objecttrandemo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class ObjectTranDemo extends Activity implements OnClickListener{
private Button sButton,pButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupViews();
}
//initial the views
public void setupViews(){
sButton = (Button)findViewById(R.id.button1);
pButton = (Button)findViewById(R.id.button2);
sButton.setOnClickListener(this);
pButton.setOnClickListener(this);
}
//Serializeable object trance
public void SerializeMethod(){
Person mPerson = new Person();
mPerson.setName("durant");
mPerson.setAge(25);
Intent mIntent = new Intent(this,ObjectTranDemo1.class);
Bundle mBundle = new Bundle();
mBundle.putSerializable("mPerson",mPerson);
mIntent.putExtras(mBundle);
startActivity(mIntent);
}
//Pacelable object trance
public void PacelableMethod(){
Book mBook = new Book();
mBook.setBookName("a man from mars");
mBook.setAuthor("james");
mBook.setPublishTime(2014);
Intent mIntent = new Intent(this,ObjectTranDemo2.class);
Bundle mBundle = new Bundle();
mBundle.putParcelable("mBook", mBook);
mIntent.putExtras(mBundle);
startActivity(mIntent);
}
@Override
public void onClick(View v) {
if(v == sButton){
SerializeMethod();
}else{
PacelableMethod();
}
}
}
5.新建activity ObjectTranDemo1.java用來顯示Serializable接口傳遞過來的數據
package com.example.objecttrandemo;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class ObjectTranDemo1 extends Activity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView mTextView = new TextView(this);
Person mPerson = (Person)getIntent().getSerializableExtra("mPerson");
mTextView.setText("You name is: " + mPerson.getName() + "\n"+
"You age is: " + mPerson.getAge());
setContentView(mTextView);
}
}
至此,Serializable接口傳遞數據完畢,對了,別忘了,在Mainfest.xml文件中聲明新的activity
package="com.example.objecttrandemo"
android:versionCode="1"
android:versionName="1.0" >
android:minSdkVersion="8"
android:targetSdkVersion="18" />
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
android:name="com.example.objecttrandemo.ObjectTranDemo"
android:label="@string/app_name" >
下面看Parcelable的傳遞:
實現Parcelable一般需要4個步驟:
1)implements Parcelable
2)重寫writeToParcel方法,將你的對象序列化為一個Parcel對象,即:將類的數據寫入外部提供的Parcel中,打包需要傳遞的數據到Parcel容器保存,以便從 Parcel容器獲取數據
3)重寫describeContents方法,內容接口描述,默認返回0就可以
4)實例化靜態內部對象CREATOR實現接口Parcelable.Creator
public static final Parcelable.Creator CREATOR
注:其中public static final一個都不能少,內部對象CREATOR的名稱也不能改變,必須全部大寫。需重寫本接口中的兩個方法:createFromParcel(Parcel in) 實現從Parcel容器中讀取傳遞數據值,封裝成Parcelable對象返回邏輯層,newArray(int size) 創建一個類型為T,長度為size的數組,僅一句話即可(return new T[size]),供外部類反序列化本類數組使用。
簡而言之:通過writeToParcel將你的對象映射成Parcel對象,再通過createFromParcel將Parcel對象映射成你的對象。也可以將Parcel看成是一個流,通過writeToParcel把對象寫到流里面,在通過createFromParcel從流里讀取對象,只不過這個過程需要你來實現,因此寫的順序和讀的順序必須一致。
具體:
1.新建Book的實體類:
Book.java:
package com.example.objecttrandemo;
import android.os.Parcel;
import android.os.Parcelable;
public class Book implements Parcelable{
private String bookName;
private String author;
private int publishTime;
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getPublishTime() {
return publishTime;
}
public void setPublishTime(int publishTime) {
this.publishTime = publishTime;
}
//Internal Description Interface,You do not need to manage
@Override
public int describeContents() {
return 0;
}
//give some attention to the oder betwwen writeToParcel and createFromParcel
@Override
public void writeToParcel(Parcel parcel, int flags){
parcel.writeString(bookName);
parcel.writeString(author);
parcel.writeInt(publishTime);
}
public static final Parcelable.Creator CREATOR = new Creator() {
@Override
public Book[] newArray(int size) {
return new Book[size];
}
@Override
public Book createFromParcel(Parcel source) {
Book mBook = new Book();
mBook.bookName = source.readString();
mBook.author = source.readString();
mBook.publishTime = source.readInt();
return mBook;
}
};
}
2.新建activity :ObjectTranDemo2.java.用來顯示parcelable的數據:
package com.example.objecttrandemo;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class ObjectTranDemo2 extends Activity{
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView mTextView = new TextView(this);
Book mBook = (Book)getIntent().getParcelableExtra("mBook");
mTextView.setText("Book name is: " + mBook.getBookName()+"\n"+
"Author is: " + mBook.getAuthor() + "\n" +
"PublishTime is: " + mBook.getPublishTime());
setContentView(mTextView);
}
}
總結
以上是生活随笔為你收集整理的android java 实体类 object变量 保存_Android中Intent传递对象的两种方法Serializable,Parcelable...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA取钱多线程实验_JAVA多线程-
- 下一篇: android关机位置定位,Androi