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;
     }
 }



相关文章
|
1月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
109 1
|
2月前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
8天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
19天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
2月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
61 20
Android经典面试题之图片Bitmap怎么做优化
|
28天前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
76 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
1月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第3天】在Java编程的世界里,对象序列化与反序列化是实现数据持久化和网络传输的关键技术。本文将深入探讨Java序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。
|
19天前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
16 0
|
2月前
|
JSON fastjson Java
niubility!即使JavaBean没有默认无参构造器,fastjson也可以反序列化。- - - - 阿里Fastjson反序列化源码分析
本文详细分析了 Fastjson 反序列化对象的源码(版本 fastjson-1.2.60),揭示了即使 JavaBean 沲有默认无参构造器,Fastjson 仍能正常反序列化的技术内幕。文章通过案例展示了 Fastjson 在不同构造器情况下的行为,并深入探讨了 `ParserConfig#getDeserializer` 方法的核心逻辑。此外,还介绍了 ASM 字节码技术的应用及其在反序列化过程中的角色。
73 10