2012-04-26 167 views
0

如其他地方所述;在Android活动之间传递实例的方式是使传递对象实现可序列化或可分段的接口。正如我所看到的,只要您的Android应用程序适合展示您的狗的年龄和名称,这很好。使用稍微更高级的对象而不使用静态引用是有问题的。Android活动之间传递对象的限制

要通过的对象使用例如一个外部图书馆的目的。 为了序列化工作,所有使用的类(包括库中)需要声明这个接口,否则Android将抛出一个运行时IOException,指出对象不能被序列化(某些东西不是impl。可序列化的接口或者没有no- arg构造函数)。因此,我猜想可序列化方法需要重新编译库。 Parcel方法要求将对象的字段写入某些输出。该输出支持自定义对象,但传递对象(包括库)需要再次实现可串行化接口才能工作。

什么是使用外部库传递实例的解决方案?

回答

0

其中一种方法是为每个不想要在活动之间传递的不是Serializable类型实现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活动通过你的对象,只是反序列化回你的对象,当你需要。