編輯:關於Android編程
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; } }
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(); } } }
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() + + You age is: + mPerson.getAge()); setContentView(mTextView); } }
實現Parcelable一般需要4個步驟:
1)implements Parcelable
2)重寫writeToParcel方法,將你的對象序列化為一個Parcel對象,即:將類的數據寫入外部提供的Parcel中,打包需要傳遞的數據到Parcel容器保存,以便從 Parcel容器獲取數據
3)重寫describeContents方法,內容接口描述,默認返回0就可以
4)實例化靜態內部對象CREATOR實現接口Parcelable.Creator
public static final Parcelable.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.Creator2.新建activity :ObjectTranDemo2.java.用來顯示parcelable的數據: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; } }; }
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()+ + Author is: + mBook.getAuthor() + + PublishTime is: + mBook.getPublishTime()); setContentView(mTextView); } }
onLayout方法是ViewGroup中子View的布局方法,用於放置子View的位置。放置子View很簡單,只需在重寫onLayout方法,然後獲取子View的實例,
本文實例講述了Android AutoCompleteTextView連接數據庫自動提示的方法。分享給大家供大家參考,具體如下:這個簡單例子也體現MVC的思想。AutoC
前言 之前博客裡已經將了MediaPlayer的簡單應用,如何使用MediaPlayer在Android應用中播放音頻。這篇博客在MediaPlayer使用的基礎
目前,各種App的社區或者用戶曬照片、發說說的地方,都提供了評論功能,為了更好地學習,自己把這個功能實現了一下,做了個小的Demo。首先推薦一款實用的插件LayoutCr