1. 程式人生 > >Android平臺實現點陣圖(Bitmap)的序列化和反序列化

Android平臺實現點陣圖(Bitmap)的序列化和反序列化

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])即可。估計本方法是供外部類反序列化本類陣列使用。

示例:

需求:我們經常需要在多個部件(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;
     }
 }