Android平臺實現點陣圖(Bitmap)的序列化和反序列化
阿新 • • 發佈:2019-01-23
android整個上層java開發框架可以分為四個方面:介面(activity和appwidget)、訊息(Intent和Message)、服務(Service)和資料(Sqllite、Content Provider)。
1.新的序列化方式:
android提供了一種新的型別:Parcel。本類被用作封裝資料的容器,封裝後的資料可以通過Intent或IPC傳遞。
除了基本型別以外,只有實現了Parcelable介面的類才能被放入Parcel中。
Parcelable實現要點:需要實現三個東西
1)writeToParcel 方法。該方法將類的資料寫入外部提供的Parcel中.宣告如下:
writeToParcel (Parcel dest, int flags) 具體引數含義見javadoc
2)describeContents方法。沒搞懂有什麼用,反正直接返回0也可以
3)靜態的Parcelable.Creator介面,本介面有兩個方法:
createFromParcel(Parcel in) 實現從in中創建出類的例項的功能
newArray(int size) 建立一個型別為T,長度為size的陣列,僅一句話(return new T[size])即可。估計本方法是供外部類反序列化本類陣列使用。
示例:
1.新的序列化方式:
android提供了一種新的型別:Parcel。本類被用作封裝資料的容器,封裝後的資料可以通過Intent或IPC傳遞。
除了基本型別以外,只有實現了Parcelable介面的類才能被放入Parcel中。
Parcelable實現要點:需要實現三個東西
1)writeToParcel 方法。該方法將類的資料寫入外部提供的Parcel中.宣告如下:
writeToParcel (Parcel dest, int flags) 具體引數含義見javadoc
2)describeContents方法。沒搞懂有什麼用,反正直接返回0也可以
3)靜態的Parcelable.Creator介面,本介面有兩個方法:
createFromParcel(Parcel in) 實現從in中創建出類的例項的功能
newArray(int size) 建立一個型別為T,長度為size的陣列,僅一句話(return new T[size])即可。估計本方法是供外部類反序列化本類陣列使用。
示例:
需求:我們經常需要在多個部件(activity或service)之間通過Intent傳遞一些資料,簡單型別(如數字、字串)的可以直接放入Intent。複雜型別(例如,J2ee中的Bean)的必須實現Parcelable介面。示例如下:
package breakan.serializable; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Bitmap.CompressFormat; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.widget.ImageView; import android.widget.TextView; public class SerializableActivity extends Activity { private Bitmap bitmap = null; private ObjectOutputStream oos = null; private ObjectInputStream ois = null; // myBitmap1是要被序列化的物件 private MyBitmap myBitmap1 = null; // myBitmap2是反序列化後得到的物件 private MyBitmap myBitmap2 = null; private TextView tv1 = null; private ImageView img1 = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); bitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.icon)) .getBitmap(); myBitmap1 = new MyBitmap(BytesBitmap.getBytes(bitmap), "icon.png"); tv1 = (TextView) findViewById(R.id.tv1); img1 = (ImageView) findViewById(R.id.img1); try { // 序列化myBitmap物件 oos = new ObjectOutputStream(new FileOutputStream( "/data/data/breakan.serializable/bitmap.bin")); oos.writeObject(myBitmap1); oos.flush(); // 反序列化myBitmap物件 ois = new ObjectInputStream(new FileInputStream( "/data/data/breakan.serializable/bitmap.bin")); myBitmap2 = (MyBitmap) ois.readObject(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (oos != null) { oos.close(); } if (ois != null) { ois.close(); } } catch (Exception e) { e.printStackTrace(); } } tv1.setText(myBitmap2.getName()); img1.setImageBitmap(BytesBitmap.getBitmap(myBitmap2.getBitmapBytes())); } } /** * 因為Bitmap沒有實現序列化,所以不能直接在序列化類(MyBitmap)中使用 * BytesBitmap用於實現Bitmap和byte[]間的相互轉換 * @author joran * */ class BytesBitmap { public static Bitmap getBitmap(byte[] data) { return BitmapFactory.decodeByteArray(data, 0, data.length); } public static byte[] getBytes(Bitmap bitmap) { ByteArrayOutputStream baops = new ByteArrayOutputStream(); bitmap.compress(CompressFormat.PNG, 0, baops); return baops.toByteArray(); } } /** * MyBitmap是要被序列化的類 * 其中包含了通過BytesBitmap類得到的Bitmap中資料的陣列 * 和一個儲存點陣圖的名字的字串,用於標識圖片 * @author joran * */ class MyBitmap implements Serializable { /** * serialVersionUID解釋: * http://www.blogjava.net/invisibletank/archive/2007/11/15/160684.html */ private static final long serialVersionUID = 1L; private byte[] bitmapBytes = null; private String name = null; public MyBitmap(byte[] bitmapBytes, String name) { // TODO Auto-generated constructor stub this.bitmapBytes = bitmapBytes; this.name = name; } public byte[] getBitmapBytes() { return this.bitmapBytes; } public String getName() { return this.name; } }