首页 技术 正文
技术 2022年11月10日
0 收藏 638 点赞 2,524 浏览 3398 个字

我们知道SharedPreferences简单类型的数据。比如。String、int等。

假设想用SharedPreferences存取更复杂的数据类型(类、图像等),就须要对这些数据进行编码。

我们一般会将复杂类型的数据转换成Base64编码,然后将转换后的数据以字符串的形式保存在
XML文件里。

       Android SDK中并未提供Base64编码和解码库。

因此,须要使用第三方的jar包。

在本例中使用了Apache Commons组件集中的Codec组件进行Base64编码和解码。读者能够从例如以下的地址下载Codec组件的安装包。

       在Androidproject文件夹的lib子文件夹中已经包括了Codec组件的jar包(commons-codec-1.4.jar)。因此,读者能够在该project中直接使用Codec组件。

在本例中将一个Product类的对象实例和一个图像保存在XML文件里,并在程序又一次执行后从XML文件装载Product对象和图像。

以下是Product类的代码: 

java代码:

package eoe.mobile;import java.io.Serializable;
// 须要序列化的类必须实现Serializable接口
public class Product implements Serializable{
private String id;
private String name;
private float price;<span style="font-family:Microsoft Yahei, Tahoma, Simsun;color:#444444;"><span style="font-size: 14px; font-weight: 700; line-height: 21px;">
</span></span>

在存取数据之前。须要使用以下的代码创建一个SharedPreferences对象。

       mySharedPreferences = getSharedPreferences("base64",Activity.MODE_PRIVATE);当中mySharedPreferences是在类中定义的SharedPreferences类型变量。

在保存Product对象之前,须要创建Product对象,并将对应组件中的值赋给Product类的对应属性。将Product对象保存在XML文件里的代码例如以下:

java代码:

Product product = new Product();
product.setId(etProductID.getText().toString());
product.setName(etProductName.getText().toString());
product.setPrice(Float.parseFloat(etProductPrice.getText().toString()));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
// 将Product对象放到OutputStream中
oos.writeObject(product);
mySharedPreferences = getSharedPreferences("base64", Activity.MODE_PRIVATE);
// 将Product对象转换成byte数组,并将其进行base64编码
String productBase64 = new String(Base64.encodeBase64(baos.toByteArray()));
SharedPreferences.Editor editor = mySharedPreferences.edit();
// 将编码后的字符串写到base64.xml文件里
editor.putString("product", productBase64);
editor.commit();

保存图像的方法与保存Product对象的方法类似。因为在保存之前,须要选择一个图像,并将该图像显示在ImageView组件中,因此。从ImageView组件中能够直接获得要保存的图像。

将图象保存在XML文件里的代码例如以下:

java代码:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 将ImageView组件中的图像压缩成JPEG格式,并将压缩结果保存在ByteArrayOutputStream对象中
((BitmapDrawable) imageView.getDrawable()).getBitmap().compress(CompressFormat.JPEG, 50, baos);
String imageBase64 = new String(Base64.encodeBase64(baos.toByteArray()));
// 保存由图像字节流转换成的Base64格式字符串
editor.putString("productImage", imageBase64);
editor.commit();

当中compress方法的第2个參数表示压缩质量,取值范围是0至100,0表示最高压缩比,但图像效果最差,100则恰恰相反。

在本例中取了一个中间值50。

从XML文件里装载Product对象和图像是保存的逆过程。

也就是从XML文件里读取Base64格式的字符串,然后将其解码成字节数组。最后将字节数组转换成Product和Drawable对象。装载Product对象的代码例如以下:

java代码:

String productBase64 = mySharedPreferences.getString("product", "");
// 对Base64格式的字符串进行解码
byte[] base64Bytes = Base64.decodeBase64(productBase64.getBytes());
ByteArrayInputStream bais = new ByteArrayInputStream(base64Bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
// 从ObjectInputStream中读取Product对象
Product product = (Product) ois.readObject();<span style="font-family:Microsoft Yahei, Tahoma, Simsun;color:#444444;"><span style="font-size: 14px; font-weight: 700; line-height: 21px;">
</span></span>

装载图像的代码例如以下:

java代码:

String imageBase64 = mySharedPreferences.getString("productImage","");
base64Bytes = Base64.decodeBase64(imageBase64.getBytes());
bais = new ByteArrayInputStream(base64Bytes);
// 在ImageView组件上显示图像
imageView.setImageDrawable(Drawable.createFromStream(bais,"product_image"));<span style="font-family:Microsoft Yahei, Tahoma, Simsun;color:#444444;"><span style="font-size: 14px; font-weight: 700; line-height: 21px;">
</span></span>

在上面的代码中使用了Drawable类的createFromStream方法直接从流创建了Drawable对象,并使用setImageDrawable图像显示的在该方法中ImageView部件。

版权声明:本文博主原创文章。博客,未经同意,不得转载。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,493
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,295