Android平台实现位图(Bitmap)的序列化和反序列化

来源:互联网 发布:java获取数据库表字段 编辑:程序博客网 时间:2024/06/11 14:20
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;     } }