700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > android java 实体类 object变量 保存_Android中Intent传递对象的两种方法Serializable Parcelable...

android java 实体类 object变量 保存_Android中Intent传递对象的两种方法Serializable Parcelable...

时间:2021-03-18 17:16:04

相关推荐

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();

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);

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。