变量的值在 Parcelable 对象的构造函数之外丢失

Variable's value gets lost outside of the constructor in a Parcelable object

String 变量 finalMapSearchUrl 在构造函数中与另一个 String (mapUrlParam) 连接,日志显示预期值:Final map URL : https://www.google.com/maps/search/?api=1&query=Spilia%20Beach (这里是 mapUrlParam = Spilia Beach)。但是,当我从 class 外部调用 getMapSearchUrl() 方法并监视日志时,finalMapSearchUrl 的值现在恢复为默认值 https://www.google.com/maps/search/?api=1&query=。登录 getMapSearchUrl()finalMapSearchUrl = https://www.google.com/maps/search/?api=1&query=。关于何时、为什么以及如何不在构造函数之外保留它的值的任何想法?

PlaceObject.java class:

public class PlaceObject implements Parcelable { // Implementing the Parcelable interface to allow for cleaner and faster code

    private static final String TAG = PlaceObject.class.getSimpleName();
    private static final String baseMapSearchUrl = "https://www.google.com/maps/search/?api=1&query="; // Base url for launching a Map activity with a Search Intent

    // Using int so that the values can be accessed via R.string etc.
    private int name;
    private int description;
    private int category;
    private String locationDistance;
    private String finalMapSearchUrl = baseMapSearchUrl;

    PlaceObject(int name, int description, int category , String locationDistance, String mapUrlParam) {
        this.name = name;
        this.description = description;
        this.locationDistance = locationDistance;
        this.category = category;
        finalMapSearchUrl += Uri.encode(mapUrlParam);
        Log.d(TAG,"Final map URL : " + finalMapSearchUrl);
    }

    private PlaceObject(Parcel in) {
        name = in.readInt();
        description = in.readInt();
        locationDistance = in.readString();
        category = in.readInt();
    }

    public static final Creator<PlaceObject> CREATOR = new Creator<PlaceObject>() {
        @Override
        public PlaceObject createFromParcel(Parcel in) {
            return new PlaceObject(in);
        }

        @Override
        public PlaceObject[] newArray(int size) {
            return new PlaceObject[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeInt(name);
        parcel.writeInt(description);
        parcel.writeString(locationDistance);
        parcel.writeInt(category);
    }

    public int getName() {
        return name;
    }

    public int getDescription() {
        return description;
    }

    public String getLocationDistance() {
        return locationDistance;
    }

    public int getCategory() {
        return category;
    }

    public String getMapSearchUrl() {
        Log.d(TAG,"finalMapSearchUrl = " + finalMapSearchUrl);
        return finalMapSearchUrl; //TODO:sp figure out why the variable's value gets lost after the constructor is done
    }
} 

因为您得到的只是基础 url 而不是基础 Parceled

解决方案:

加入parcel,注意书写顺序,

像这样:

private PlaceObject(Parcel in) {
        name = in.readInt();
        description = in.readInt();
        category = in.readInt();
        locationDistance = in.readString();
        finalMapSearchUrl = in.readString(); 
    }

别忘了解决这个问题:

  @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeInt(name);
        parcel.writeInt(description);
        parcel.writeInt(category);        
        parcel.writeString(locationDistance);
        parcel.writeString(finalMapSearchUrl);
    }