2012-04-26 165 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活動通過你的對象,只是反序列化回你的對象,當你需要。