国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android中Intent傳遞對象的兩種方法Serializable,Parcelable

2020-04-11 10:55:52
字體:
來源:轉載
供稿:網友

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:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="android object trance" /> <Button android:id="@+id/button1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Serializable" /> <Button android:id="@+id/button2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Parcelable" /> </LinearLayout>

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

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.objecttrandemo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.objecttrandemo.ObjectTranDemo" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ObjectTranDemo1"></activity> <activity android:name=".ObjectTranDemo2"></activity> </application> </manifest>

下面看Parcelable的傳遞:

實現Parcelable一般需要4個步驟:

1)implements Parcelable

2)重寫writeToParcel方法,將你的對象序列化為一個Parcel對象,即:將類的數據寫入外部提供的Parcel中,打包需要傳遞的數據到Parcel容器保存,以便從 Parcel容器獲取數據

3)重寫describeContents方法,內容接口描述,默認返回0就可以

4)實例化靜態內部對象CREATOR實現接口Parcelable.Creator

public static final Parcelable.Creator<T> 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<Book> CREATOR = new Creator<Book>() { @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); } }

在上篇文章給大家介紹了,Intent傳遞對象之Serializable和Parcelable的區別,感興趣的朋友可以點擊了解詳情。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 清苑县| 封开县| 吉木萨尔县| 田阳县| 沙湾县| 泗水县| 寿宁县| 天祝| 肇东市| 三门县| 岑溪市| 民勤县| 连云港市| 开江县| 墨竹工卡县| 峡江县| 清流县| 囊谦县| 遂平县| 民县| 蕲春县| 龙里县| 乌拉特前旗| 建始县| 扶绥县| SHOW| 静安区| 方山县| 平舆县| 浦东新区| 丹阳市| 万宁市| 安徽省| 定结县| 安塞县| 苏州市| 绥芬河市| 苏州市| 巴彦淖尔市| 石阡县| 九龙城区|