固定:在底部回答
我正在为一个项目编写一个Android应用程序,我试图使用parcelable对象.我有2个可分类的课程.第一个是只有2个参数的普通类.第二个是具有附加属性的类,以及具有来自第一个类的类型的列表以及它的附加对象.
每次我尝试将第二个类的对象传递给另一个Activity时,我得到android.os.BadParcelableException:当解组时ClassNotFoundException
并关闭应用程序.
我现在搜索了几个小时并尝试了多种解决方案,但没有任 当我只将第一个类的对象传递给另一个活动时,错误不会发生.
这是我的代码:
package de.softwareproject.v3.testclasses;
import android.os.Parcel;
import android.os.Parcelable;
public class Cart implements Parcelable {
private String name;
private Integer priceInCents;
public Cart() {}
public Cart(Parcel in){
readFromParcel(in);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPriceInCents() {
return priceInCents;
}
public void setPriceInCents(Integer priceInCents) {
this.priceInCents = priceInCents;
}
public static final Parcelable.Creator<Cart> CREATOR = new Parcelable.Creator<Cart>() {
@Override
public Cart createFromParcel(Parcel source) { …Run Code Online (Sandbox Code Playgroud) 我有一个ArrayList我在之间传递activities.在这里ArrayList,由一个class有四个变量的对象组成.其中的一个变量是另一种ArrayList<object>是从另一个class.
我已经实现Parcelable上都和我敢肯定我已经正确地完成了parcelable方法.以下是错误:
错误:
03-18 02:37:27.063: D/dalvikvm(3249): GC_FOR_ALLOC freed 82K, 6% free 3020K/3180K, paused 1ms, total 3ms
03-18 02:37:27.093: I/dalvikvm-heap(3249): Grow heap (frag case) to 3.626MB for 635808-byte allocation
03-18 02:37:27.103: D/dalvikvm(3249): GC_FOR_ALLOC freed 5K, 5% free 3635K/3804K, paused 10ms, total 10ms
03-18 02:37:27.173: D/(3249): HostConnection::get() New Host Connection established 0xb96396c0, tid 3249
03-18 02:37:27.243: W/EGL_emulation(3249): eglSurfaceAttrib not implemented
03-18 02:37:27.253: D/OpenGLRenderer(3249): Enabling debug mode 0
03-18 …Run Code Online (Sandbox Code Playgroud) 我想在多平台项目中创建一个类,并用Parcelize它来制作ParcelableAndroid版本.
所以在我的lib-common项目中,我尝试过:
expect annotation class Parcelize()
expect interface Parcelable
@Parcelize
data class Foo(x: Int): Parcelable
Run Code Online (Sandbox Code Playgroud)
在我的lib-android项目中:
actual typealias Parcelize = kotlinx.android.parcel.Parcelize
actual typealias Parcelable = android.os.Parcelable
Run Code Online (Sandbox Code Playgroud)
第一个问题是,摇篮插件kotlin-android-extensions似乎并没有参加lib-android的build.gradle,所以包kotlinx.android.parcel没有被发现.我设法通过直接导入库来解决这个问题:
implementation "org.jetbrains.kotlin:kotlin-android-extensions-runtime:$kotlin_version"
Run Code Online (Sandbox Code Playgroud)
有了这个,编译的actual定义Parcelable.
但是,我从定义中得到一个错误Foo,好像它没有正确注释@Parcelize:
类
Foo不是抽象的,也不实现public abstract fun writeToParcel(p0: Parcel!, p1: Int): Unit在中定义的抽象成员android.os.Parcelable
android parcelable kotlin kotlin-android-extensions kotlin-multiplatform
对于我的Android应用程序,我得到了几个解组错误,尽管我认为我已经完成了通过Parcelables 正确保存和加载对象所需的一切.你能告诉我我的代码有什么问题吗?
错误1:
java.lang.RuntimeException: Unable to start activity ComponentInfo
Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@41279860: Unmarshalling unknown type code 6619241 at offset 1372
at android.os.Parcel.readValue(Parcel.java:1922)
at android.os.Parcel.readMapInternal(Parcel.java:2094)
at android.os.Bundle.unparcel(Bundle.java:223)
at android.os.Bundle.getParcelable(Bundle.java:1158)
at android.app.Activity.onCreate(Activity.java:860)
at my.app.package.PlayComputer.onCreate(PlayComputer.java:1012)
at android.app.Activity.performCreate(Activity.java:4465)
Run Code Online (Sandbox Code Playgroud)
在1012行MyActivity是调用super.onCreate(savedInstanceState);中Activity的onCreate().
protected void onSaveInstanceState(Bundle savedInstanceState) {
if (myObject == null) {
savedInstanceState.putParcelable("myObject", null);
}
else {
savedInstanceState.putParcelable("myObject", myObject);
}
savedInstanceState.putInt(...);
savedInstanceState.putString(...);
savedInstanceState.putBoolean(...);
super.onSaveInstanceState(savedInstanceState);
}
Run Code Online (Sandbox Code Playgroud)
myObject是一类MyObject具有以下方法:
public void writeToParcel(Parcel out, int flags) …Run Code Online (Sandbox Code Playgroud) 我试图Fragment通过使用来保存我的状态Parcelable.
当我希望返回我在Parcelable中保存的String数组时,这会导致以下代码:
public MyObject createFromParcel(Parcel in) {
titles=in.readStringArray(???);
}
Run Code Online (Sandbox Code Playgroud)
现在readStringArray需要一个参数,一个String[]......但为什么呢?它可以只给出我存储在其中的字符串.我不知道先天有多少,所以这很糟糕.:(
该文件说以下内容:
That is, nothing.
EDIT: If anyone has the same problem: I ended up using writeBundle()/ readBundle()并把我String[]放入Bundle.
我有一个接口IA和类B和C来实现它们.B和C都可以实现Parcelable.
然后我有一个棘手的部分:
D级有一个ArrayList< IA >.我也需要在插入B和C类arraylist.它们具有相同的结构,但"IS-A"关系不适用.
我需要将D从一个活动传递到另一个活动作为包裹.
我试着写(ArrayList<IA>) in.readSerializable但我得到了IOException.我知道如果IA不是一个接口问题很容易,但我似乎无法找到一个简单的解决方案.
有任何想法吗?
@SuppressWarnings("unchecked")
public D (Parcel in) {
list = new ArrayList<IA>();
(...)
list = (ArrayList<IA>) in.readSerializable
}
@SuppressWarnings("rawtypes")
public static final Parcelable.Creator CREATOR =
new Parcelable.Creator() {
public D createFromParcel(Parcel in) {
return new D(in);
}
public D[] newArray(int size) {
return new D[size];
}
};
public int describeContents() {
return 0;
} …Run Code Online (Sandbox Code Playgroud) 我试图写一个parcelable数据对象从传递到activityA到activityB在我的Android应用程序.
我的对象是传递所有数据,除了我arraylist的可用服务类
data class AvailableService(val id: Int,
val name: String,
val description: String,
val price: Double,
val currency: String,
val imageUrl: String) : Parcelable {
companion object {
@JvmField @Suppress("unused")
val CREATOR = createParcel { AvailableService(it) }
}
protected constructor(parcelIn: Parcel) : this(parcelIn.readInt(),
parcelIn.readString(),
parcelIn.readString(),
parcelIn.readDouble(),
parcelIn.readString(),
parcelIn.readString())
override fun writeToParcel(dest: Parcel?, flags: Int) {
dest?.writeInt(id)
dest?.writeString(name)
dest?.writeString(description)
dest?.writeDouble(price)
dest?.writeString(currency)
dest?.writeString(imageUrl)
}
override fun describeContents() = 0
}
Run Code Online (Sandbox Code Playgroud)
上面是可用的serviceClass,接下来我有旅行,其持有arraylist的AvailableService …
基本上我在我的应用程序中有以下结构:

在没有抽象类的ProjectItem情况下实现这样的结构会很简单,但在这种情况下我不知道如何实现它.
抽象类ProjectItem需要a,CREATOR因为它应该是可以分配的.(比如
in.readTypedList(mProjectItems, ProjectItem.CREATOR);构造函数Project(Parcel in))
但事实上,CREATOR出于逻辑原因,只能在其派生类中实现.
那么,如何实现这个结构以保持类可Project分辨?
编辑
这是一个Project看起来像这样的构造函数:
private Project(Parcel in) {
in.readTypedList(mProjectItems, ProjectItem.CREATOR);
}
Run Code Online (Sandbox Code Playgroud)
但正如我已经说过的,ProjectItem不应该实施一个CREATOR
我得到以下错误:
ArrayList有BookStatus对象的值(listToPass)
我能做什么?
HomeActivity.java
ArrayList<BookStatus> listToPass = new ArrayList<BookStatus>(); // fill with smthg
protected void onPostExecute(String result) {
if (listToPass != null) {
Intent i = new Intent(getApplicationContext(),
SearchActivity.class);
// ArrayList<BookStatus> bs = new ArrayList<BookStatus> (Arrays.asList(bArr));
i.putParcelableArrayListExtra("com.example.books.BookStatus", listToPass);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)
SearchActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.searchactivity_main);
Bundle bundle = getIntent().getExtras();
ArrayList<BookStatus> bookStatus = bundle
.getParcelable("com.example.books.BookStatus");
Run Code Online (Sandbox Code Playgroud)
BookStatus.java
public class BookStatus implements Parcelable {
public BookStatus() { …Run Code Online (Sandbox Code Playgroud) 我想知道是否有任何尺寸限制Parcelable附加到Intent?我了解一些文档Intents,Bundles,Parcelable再有任何关于大小限制.但我读了一些答案,说附件的大小Parcelable是有限的(例如,1 MB).因此Parcelable受尺寸限制还是仅取决于设备?
android ×10
parcelable ×10
arraylist ×2
java ×2
kotlin ×2
exception ×1
inheritance ×1
interface ×1