【问题标题】:java.lang.RuntimeException: Parcel: unable to marshal value com.package.NutritionInfo@84055e1java.lang.RuntimeException:包裹:无法编组值 com.package.NutritionInfo@84055e1
【发布时间】:2016-03-19 18:32:48
【问题描述】:

在两种情况下,只有一种给我这个独特的错误。我几乎完全按照 Android 教程中的角色进行操作,并且出于某种原因,它仅适用于某些领域。

 Intent shareIntent = new Intent();
 shareIntent.setAction(Intent.ACTION_SEND);
 shareIntent.putExtra(Intent.EXTRA_TEXT, getSharedNutritionText(mMultiSelector.getSelectedPositions()));
 shareIntent.setType("text/plain");
 startActivity(shareIntent);

给出以下错误:

    12-13 02:10:07.838    8261-8261/com.example E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.skylan.homeworkpro, PID: 8261
java.lang.RuntimeException: Parcel: unable to marshal value com.example.NutritionInfo@2d54b4d1
        at android.os.Parcel.writeValue(Parcel.java:1343)
        at android.os.Parcel.writeList(Parcel.java:717)
        at android.os.Parcel.writeValue(Parcel.java:1290)
        at android.os.Parcel.writeArrayMapInternal(Parcel.java:644)
        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313)
        at android.os.Bundle.writeToParcel(Bundle.java:1034)
        at android.os.Parcel.writeBundle(Parcel.java:669)
        at android.app.FragmentState.writeToParcel(Fragment.java:138)
        at android.os.Parcel.writeTypedArray(Parcel.java:1197)
        at android.app.FragmentManagerState.writeToParcel(FragmentManager.java:376)
        at android.os.Parcel.writeParcelable(Parcel.java:1363)
        at android.os.Parcel.writeValue(Parcel.java:1268)
        at android.os.Parcel.writeArrayMapInternal(Parcel.java:644)
        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313)
        at android.os.Bundle.writeToParcel(Bundle.java:1034)
        at android.os.Parcel.writeBundle(Parcel.java:669)
        at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:2925)
        at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3299)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5257)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

而在我的另一个(几乎)相同的片段中,我有以下代码:

 Intent shareIntent = new Intent();
 shareIntent.setAction(Intent.ACTION_SEND);
 shareIntent.putExtra(Intent.EXTRA_TEXT, getSharedLabelText(mMultiSelector.getSelectedPositions())); 
 shareIntent.setType("text/plain");
 startActivity(shareIntent);

这是我的 NutritionInfo 课程

public class NutritionInfo extends SugarRecord<NutritionInfo> {

public String nutritionName;
public String nutritionHeaderTitle;
public int nutritionCalories;
public boolean nutritionArchived;
public boolean nutritionChecked;

public NutritionInfo () {}

public NutritionInfo (String name, String headerTitle, int cal, boolean isArchived, boolean isChecked) {
    nutritionName = name;
    nutritionHeaderTitle = headerTitle;
    nutritionCalories = cal;
    nutritionArchived = isArchived;
    nutritionChecked = isChecked;
    }
}

这是我的营养吸收剂:

public class NutritionDisplayFragment extends BaseFragment implements ActionMode.Callback {
private String getSharedNutritionText(List<Integer> positions) {
    String shareText;
    if (positions.equals(null)) {
        shareText = "";
    } else {
        shareText = "Food and carbs:\n";
        for (int go = 0; go < positions.size(); go++) {
            shareText = shareText +
                    nutritionList.get(go).nutritionTitle + " - \t" +
                    nutritionList.get(go).nutritionCarbs + "\n";
        }
    }
    return shareText;
} ( . . . )
}

vs 我的标签获取器:

public class LabelManagerFragment extends BaseFragment implements ActionMode.Callback {    
private String getSharedLabelText(List<Integer> positions) {
    String shareText = "";
    if (positions.equals(null)) {
        shareText = "";
    } else {
        for (int go = 0; go < positions.size(); go++) {
            shareText = shareText +
                        labelList.get(go).labelName + "\t" +
                        labelList.get(go).labelYear + "\n";
        }
    }
    return shareText;
} ( . . . )
}

这不会产生运行时错误。两个 get() 方法都返回一个简单的字符串。为什么第一个错误抱怨“com.package.NutritionInfo@84055e1”,它甚至不是共享的数据类型,因为不可编组,而另一个共享字符串时没有搭便车?

为了更清楚:我尝试在方法所在的位置硬编码"hello world"(该方法通常返回简单的String),但遇到了同样的问题。

【问题讨论】:

  • 把你的营养课代码和包裹一起贴出来。
  • 添加了我能找到的相关内容。
  • 但错误似乎与包裹的东西有关。也许您尝试设置一个空值。这就是我想看包裹的原因。
  • 对不起,我不太明白。我也想了解究竟是什么被包裹,但我无法弄清楚。我不明白为什么它试图编组看起来像是一个 NutritionInfo 对象,如果这确实是它试图打包的东西。请澄清我应该发布什么代码,我会交付。
  • 出于某种原因,Fragment(我猜)正在尝试序列化 NutritionInfo 对象(也许当它试图保存其实例时?)。这是不可能的(NutritionInfo 不可序列化或不可打包,或者序列化过程中有问题)。以stackoverflow.com/q/3818745/775894 为例。

标签: android android-intent send parcel


【解决方案1】:

实现 Parcelable 接口如下:

public class NutritionInfo extends SugarRecord<NutritionInfo> implements Parcelable {

  public String nutritionName;
  public String nutritionHeaderTitle;
  public int nutritionCalories;
  public boolean nutritionArchived;
  public boolean nutritionChecked;

  public NutritionInfo() {
  }

  public NutritionInfo(String name, String headerTitle, int cal, boolean isArchived, boolean isChecked) {
    nutritionName = name;
    nutritionHeaderTitle = headerTitle;
    nutritionCalories = cal;
    nutritionArchived = isArchived;
    nutritionChecked = isChecked;
  }

  protected NutritionInfo(Parcel in) {
    nutritionName = (String) in.readValue(null);
    nutritionHeaderTitle = (String) in.readValue(null);
    nutritionCalories = in.readInt();
    nutritionArchived = in.readByte() != 0;
    nutritionChecked = in.readByte() != 0;
  }

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

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

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

  @Override
  public void writeToParcel(Parcel dest, int flags) {
    dest.writeValue(nutritionName);
    dest.writeValue(nutritionHeaderTitle);
    dest.writeInt(nutritionCalories);
    dest.writeByte((byte) (nutritionArchived ? 1 : 0));
    dest.writeByte((byte) (nutritionChecked ? 1 : 0));
  }
}

对你的糖记录做同样的事情。如果超类实现了 Parcelable 则不需要在 NutritionInfo 中再次声明,只需实现这些东西即可。

【讨论】:

  • 简单、干净、有效!谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
相关资源
最近更新 更多