Android:putExtra parcelable停止活动启动。没有错误

时间:2017-03-21 13:08:33

标签: java android android-intent parcelable parcel

我正在尝试创建一个应用程序,此时在应用程序中我正在启动一项活动,并为该活动添加了一些可插入的附加内容。但是,随着我的额外内容的添加,意图将无法启动活动。注释putExtra行可以使其正常工作。没有错误可言,应用程序只是循环并允许再次使用先前的活动。 问题代码在于:

//puzOut is a Puzzle object (code below)
intent intent = new Intent(ChooseActivity.this, GameActivity.class);
intent.putExtra("puzzle", puzOut); // <- prevents activity starting
startActivity(intent);

putExtra中的数据是我的应用程序Puzzle中的一个对象。下面是代码,包括Parcelling代码。

public class Puzzle implements Parcelable{
private String Name;
private String pictureSet;
private Fruit_Tile[] fruitArray;
int rows;
int columns;


public Puzzle(String puzzleId, String picSet, Fruit_Tile[] array, int rowCount, int columnCount)
{
    Name = puzzleId;
    pictureSet = picSet;
    fruitArray = array;
    rows = rowCount;
    columns = columnCount;

}

private Puzzle(Parcel in) {
    Name = in.readString();
    pictureSet = in.readString();
    Parcelable[] parcelableArray = in.readParcelableArray(Fruit_Tile.class.getClassLoader());
    //Fruit_Tile[] results = null;
    if(parcelableArray != null)
    {
        fruitArray = Arrays.copyOf(parcelableArray, parcelableArray.length, Fruit_Tile[].class);
    }

    rows = in.readInt();
    columns = in.readInt();
}



public String getName()
{
    return Name;
}

public String getPictureSet()
{
    return pictureSet;
}

public Fruit_Tile[] getFruitArray()
{
    return fruitArray;
}

public int getRows()
{
    return rows;
}

public int getColumns()
{
    return columns;
}


@Override
public void writeToParcel(Parcel out, int flags){
    out.writeString(Name);
    out.writeString(pictureSet);
    out.writeParcelableArray(fruitArray, flags);

    out.writeInt(rows);
    out.writeInt(columns);
}

public static final Parcelable.Creator<Puzzle> CREATOR = new Parcelable.Creator<Puzzle>(){
    public Puzzle createFromParcel(Parcel in) {
        return new Puzzle(in);
    }

    public Puzzle[] newArray(int size) {
        return new Puzzle[size];
    }
};

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

拼图对象使用另一个对象Fruit_Tile,我也试图制作parcellable。以下是该代码。

public class Fruit_Tile implements Parcelable
{


private Bitmap fruit;
private int x_Position;
private int y_Position;

public Fruit_Tile(Bitmap fruitInput, int x, int y)
{
    fruit = fruitInput;
    x_Position = x;
    y_Position = y;
}

private Fruit_Tile(Parcel in)
{
    fruit = Bitmap.CREATOR.createFromParcel(in);
    x_Position = in.readInt();
    y_Position = in.readInt();
}

public Bitmap getImage()
{
    return fruit;
}

public void setImage(Bitmap input)
{
    fruit = input;
}

public int getX_Position()
{
    return x_Position;
}

public int getY_Position()
{
    return y_Position;
}

public void setX_Position(int x) { x_Position = x; }

public void setY_Position(int y) { y_Position = y; }

public int describeContents()
{
    return 0;
}

@Override
public void writeToParcel(Parcel out, int flags)
{
    fruit.writeToParcel(out, flags);
    out.writeInt(x_Position);
    out.writeInt(y_Position);
}

public static final Parcelable.Creator<Fruit_Tile> CREATOR = new Parcelable.Creator<Fruit_Tile>(){
    public Fruit_Tile createFromParcel(Parcel in){
        return new Fruit_Tile(in);
    }

    public Fruit_Tile[] newArray(int size){
        return new Fruit_Tile[size];
    }
};

}

当我调试并步骤时,按照

startActivity(intent);

如果我不断步骤,程序最终会返回到Looper.java代码并循环。然后,我可以再次访问第一个活动的UI,然后重新开始整个过程​​。

为什么我的活动不是从这个putExtra行开始的?没有错误可言(我能找到)。 重申一下,如果putExtra被注释掉,活动将会启动。

我真的很感激一些帮助!

1 个答案:

答案 0 :(得分:0)

当您尝试在包裹中写入空值时会发生这种情况。在以下代码段中,如果“名称字符串”为null,则将导致活动启动问题。

out.writeString(Name);

因此解决方案是,在声明时设置类数据成员的默认值。喜欢

  String Name = "";

或者在写包裹时添加一个检查,如果它为空,则不要将其写在包裹中。像

if (Name != null) {
     out.writeString(Name);
 }