0
在我的代碼中,我有兩個類,它們包含彼此的實例,它們都是Parcelable。Circular Pacelables
有一個「服務器」類,它可以擁有多個「通道」類。我試圖確定的是我寫了一個無限循環到writeToParcel
和createFromParcel
方法?
下面是一些代碼:
//Server implementations
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringArray(new String[] {
NAME,
PASS,
PORT,
NICK,
ALT_NICK,
START_CHANNEL,
PORT,
WindowText});
Bundle channelBundle = new Bundle();
channelBundle.putParcelableArray("Channels", Channels);
dest.writeBundle(channelBundle);
}
//...
public IRCServer createFromParcel(Parcel in)
{
IRCServer ret = new IRCServer();
String[] Data = new String[8];
in.readStringArray(Data);
ret.NAME = Data[0];
ret.PASS = Data[1];
ret.PORT = Data[2];
ret.NICK = Data[3];
ret.ALT_NICK = Data[4];
ret.START_CHANNEL = Data[5];
ret.PORT = Data[6];
ret.WindowText = Data[7];
Bundle cBund = in.readBundle();
ret.Channels = (IRCChannel[])cBund.getParcelableArray("Channels");
return ret;
}
//Channel Implementation
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringArray(new String[] {
Name,
WindowText
});
dest.writeStringList(UserList);
Bundle ServerBundle = new Bundle();
ServerBundle.putParcelable("Server", server);
dest.writeBundle(ServerBundle);
}
//...
public IRCChannel createFromParcel(Parcel in)
{
IRCChannel ret = new IRCChannel();
String[] Data = new String[2];
in.readStringArray(Data);
ret.Name = Data[0];
ret.WindowText = Data[1];
in.readStringList(ret.UserList);
Bundle ser = in.readBundle();
ret.server = (IRCServer)ser.getParcelable("Server");
return ret;
}
其他一些注意事項:是的,內部通道Server對象是反向引用到實際的服務器對象。是的,服務器內的每個Channel對象都包含此反向引用。
問題:這個代碼只要循環無限地創建包裹,只要它告訴做第一個包裹,或者它實際上是安全的。
該工程相當。好。不要打擾在通道對象內部放置服務器引用,只是在之後重新分配它。 – Nevyn