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解釋:
* https://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;
}
}
最後更新:2017-04-04 07:03:07