我有一个对象需要在2 Activity
之间传递。该对象具有HashTable,String []等。无法弄清楚如何使它成为Parcalebale,以便我可以填充对象的数组并将单个obj或数组传递给其他Activity。
我的班级是:
public class TrainRoute { // implements Parcelable
private String RouteName;
private int RouteIndex;
private Context ctx;
private Hashtable<String, String> stationsList;
private String[] stationsNames;
private String[] trainTimings;
private boolean hasSpecialMessages;
private Hashtable<String, String> specialMessages;
private String firstStation;
private String CURRENT_ROUTE_PATH;
public TrainRoute(Context ctx, String routeName, int routeIndex, String routeUpOrDownPath, boolean hasSpecialMessages) {
this.ctx = ctx;
this.RouteName = routeName;
this.RouteIndex = routeIndex;
this.CURRENT_ROUTE_PATH = routeUpOrDownPath;
this.hasSpecialMessages = hasSpecialMessages;
}
public String getName() { return RouteName; }
public int getIndex() { return RouteIndex; }
public String[] getStationsNames()
{
if(this.stationsList == null)
{
String file = this.CURRENT_ROUTE_PATH + "/" + CONSTANTS.SUBPATH_STATIONS + "/" + this.RouteIndex + ".txt";
String[][] tempList = ResourceReader.GetValues(ctx, file, 2);
this.stationsList = new Hashtable<String, String>(tempList.length);
this.stationsNames = new String[tempList.length];
for(int i=0;i<tempList.length;i++)
{
this.stationsList.put(tempList[i][0], tempList[i][1] );
this.stationsNames[i] = tempList[i][0];
}
this.firstStation = this.stationsNames[0];
}
return stationsNames;
}
public String[] getTimings(String stationName)
{
if(this.trainTimings == null)
{
String file = this.CURRENT_ROUTE_PATH + "/" + CONSTANTS.SUBPATH_TIMINGS + "/" + this.RouteIndex + ".txt";
this.trainTimings = ResourceReader.GetLines(ctx, file);
for(int i=0;i<this.trainTimings.length;i++)
{
this.trainTimings[i] = this.trainTimings[i].substring(0, 2) + ":" + this.trainTimings[i].substring(2, 4);
}
}
int minutesFromOrigin =
Integer.parseInt(this.stationsList.get(stationName).toString())
- Integer.parseInt(this.stationsList.get(this.firstStation).toString());
String[] trainTimingsForStation = new String[this.trainTimings.length];
for (int i = 0; i < trainTimingsForStation.length; i++) {
trainTimingsForStation[i] = AddMinutes(this.trainTimings[i], minutesFromOrigin);
}
return trainTimingsForStation;
}
public void loadSpecialMessages()
{
if(this.hasSpecialMessages == true && this.specialMessages == null)
{
this.specialMessages = new Hashtable<String, String>();
String specialMessagesFilePath = this.CURRENT_ROUTE_PATH + "/" + CONSTANTS.SPECIALMESSAGES_FOLDER_NAME + "/" + this.RouteIndex + ".txt";
String[][] tempSpecialMessages = ResourceReader.GetValues(ctx, specialMessagesFilePath, 2);
for (int i = 0; i < tempSpecialMessages.length; i++)
{
tempSpecialMessages[i][1] = tempSpecialMessages[i][1].replaceAll("\\n", "\n"); // StringFunctions.replace(tempSpecialMessages[i][1], "\\n", "\n");
tempSpecialMessages[i][0] = tempSpecialMessages[i][0].substring(0, 2) + ":" + tempSpecialMessages[i][0].substring(2, 4);;
this.specialMessages.put(tempSpecialMessages[i][0], tempSpecialMessages[i][1]);
}
}
}
public boolean hasSpecialMessage(int trainIndex)
{
if(this.hasSpecialMessages == true)
{
return this.specialMessages.containsKey(this.trainTimings[trainIndex - 1]);
}
else
return false;
}
public String getSpecialMessage(int trainIndex)
{
return this.specialMessages.get((this.trainTimings[trainIndex - 1]).toString()).toString();
}
在实现Parcelable时,我无法弄清楚如何在已实现的函数中添加对象字段。
由于如此多的HashTable,String [],对于这种情况,比Parcelable更优先实现Serialiazable吗?如果添加Serializable,那么如何实现相同的ts方法。
修改 在上面的obj中,我添加了一个方法:
public Hashtable<String, String> getAllSpecialMessages() {
return this.specialMessages;
}
我正在尝试将此HashTable从我的Activity传递给另一个Activity:
intent.putExtra("specialMsgs", curTrainRoute.getAllSpecialMessages());
// OTHER ACTIVTY
Serializable data = sender.getSerializableExtra("specialMsgs");
if (data != null) {
spMsgs = new Hashtable<String, String>((HashMap<String, String>)data);
Log.i(TAG, " GOT spMsgs : Len = " + spMsgs.size());
if (spMsgs.size() > 0) {
java.util.Enumeration<String> keys = spMsgs.keys();
while(keys.hasMoreElements()) {
Log.i(TAG, "SP= " + spMsgs.get(keys));
}
}
}
这里我得到“GOT spMsgs:Len = 4.但是在Log SP =中,我得到无限空。为什么无法找到通过Hashtable的enteries ???我还缺少什么?
自从过去2天以来,我一直在寻找这个问题的一些指导,但是无法弄清楚是什么&amp;如何处理这个对象。
非常感谢任何帮助。
答案 0 :(得分:0)
我建议使用备用路由并将对象编码为JSON,因为它是从API级别1内置在Android中的,而不是像您使用Parcelable那样重新创建对象交换格式。
Serializable的问题在于您无法轻松将其添加到Intent。
答案 1 :(得分:0)
最终可以将Hasttable传递给其他Activity并按原样获取它。有了这个,我必须在其他Activity中做soem workigns,但这不是一个坏主意或许多代码可以工作。得到它。
非常感谢提琴手&amp;彼得。