Android:将此对象设为可打包

2023-12-23

我有一个对象需要在 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[],在这种情况下实现 Serialiazable 会比 Parcelable 更优选吗?如果添加可序列化,那么还如何实现相同的 ts 方法。

EDIT:在上面的 obj 中,我添加了一个方法:

    public Hashtable<String, String> getAllSpecialMessages() {
    return this.specialMessages;
}

我试图将此哈希表从我的 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= 中,我得到无限的 null。为什么无法找到传递的哈希表的输入???我还缺少什么?

自过去两天以来,我一直在寻找有关此问题的一些指导,但无法弄清楚如何处理此对象以及如何处理。

非常感谢任何帮助。


我建议采用替代路线并将对象编码为 JSON,因为它是从 API 级别 1 开始内置于 Android 中的,而不是像使用 Parcelable 时必须重新发明对象交换格式。

Serialized 的问题是您无法轻松地将其添加到 Intent 中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:将此对象设为可打包 的相关文章

随机推荐