如其他地方所述;在Android活动之间传递实例的方式是使传递对象实现可序列化或可分割的接口。正如我所看到的,只要您的Android应用程序用于显示您的狗的年龄和名字,这就很好。使用稍微更高级的对象而不使用静态引用是有问题的。
要传递的对象是使用例如一个用于其目的的外部库。 为了序列化工作所有使用的类(包括在库中)需要声明这个接口,否则Android将抛出一个运行时IOException,说明该对象无法被序列化(某些东西不是impl。可序列化的接口或没有no-arg构造函数)。因此,我猜想可序列化方法需要库重新编译。 Parcel方法要求将对象的字段写入某个输出。此输出支持自定义对象,但是再次传递对象(包括库)需要实现可序列化的接口才能工作。
使用外部库传递实例的解决方案是什么?
答案 0 :(得分:0)
其中一种方法是为每个不想在活动之间传递的Serializable类型实现Serializer类。这是一个简单的Serializer接口:
public interface Serializer {
void serialize(Object object, DataOutputStream out);
Object deserialize(DataInputStream in);
}
之后,您可以使用this或任何其他Base64编码器/解码器将DataOutputStream
转换为String
或其他可序列化类型。用于此目的的方法如下:
private String serializeToString(Object object, Serializer serializer) {
ByteArrayOutputStream bStream = new ByteArrayOutputStream();
DataOutputStream dStream = new DataOutputStream(bStream);
try {
serializer.serialize(object, dStream);
} catch (IOException e) {
logger.error(e, "Couldn't serialize " + object);
return null;
}
return Base64.encodeToString(bStream.toByteArray(), false);
}
private Object deserializeFromString(String string, Serializer serializer) {
try {
return serializer.deserialize(
new DataInputStream(
new ByteArrayInputStream(
Base64.decode(string))));
} catch (IOException e) {
logger.error(e, "Couldn't deserialize [" + string + "]");
return null;
}
}
之后,您只需将对象传递给序列化为String
的活动,并在需要时将其反序列化回您的对象。