标签: parcelable

解组时ClassNotFoundException并且真的不知道为什么

固定:在底部回答

我正在为一个项目编写一个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)

android unmarshalling parcelable

18
推荐指数
1
解决办法
1万
查看次数

Unmarshalling Android Intent Parcelable时找不到类

我有一个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)

android arraylist unmarshalling parcelable android-intent

18
推荐指数
1
解决办法
2万
查看次数

@Parcelize在多平台项目中

我想在多平台项目中创建一个类,并用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-androidbuild.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

18
推荐指数
2
解决办法
1558
查看次数

使用自定义parcelable类在Android应用中解组错误

对于我的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);ActivityonCreate().

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)

android exception parcelable runtimeexception

17
推荐指数
1
解决办法
1万
查看次数

Parcel.readStringArray()的参数是什么?

我试图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.

android parcelable

17
推荐指数
2
解决办法
5112
查看次数

Android Parcelable - 当IA是接口时,写入和读取ArrayList <IA>

我有一个接口IA和类BC来实现它们.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)

java android interface arraylist parcelable

17
推荐指数
1
解决办法
3万
查看次数

Kotlin parcelable和arrayList of parcelables

我试图写一个parcelable数据对象从传递到activityAactivityB在我的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,接下来我有旅行,其持有arraylistAvailableService …

android parcelable kotlin

17
推荐指数
3
解决办法
1万
查看次数

抽象类作为parcelable

基本上我在我的应用程序中有以下结构:

我的应用程序的uml

在没有抽象类的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

java inheritance android design-patterns parcelable

16
推荐指数
2
解决办法
8343
查看次数

ArrayList无法强制转换为Parcelable

我得到以下错误:

  • 键com..BookStatus期望Parcelable但值是一个ArrayList
  • ClassCastException:ArrayList无法强制转换为Parcelable - > and thefter:无法启动Activity - NullPointerException
  • ArrayList有BookStatus对象的值(listToPass)

    • 键com.example.books.BookStatus期望Parcelable但值是java.util.ArrayList.返回了默认值
    • 尝试转换生成的内部异常:
    • java.lang.ClassCastException:java.util.ArrayList无法强制转换为android.os.Parcelable
    • 在com.example.books4locals.SearchActivity.onCreate(SearchActivity.java:46) - >这是bundle.getparcelable方法

我能做什么?

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)

android classcastexception parcelable

16
推荐指数
1
解决办法
1万
查看次数

附加Parcelable的大小限制?

我想知道是否有任何尺寸限制Parcelable附加到Intent?我了解一些文档Intents,Bundles,Parcelable再有任何关于大小限制.但我读了一些答案,说附件的大小Parcelable是有限的(例如,1 MB).因此Parcelable受尺寸限制还是仅取决于设备?

android parcelable android-intent android-bundle

16
推荐指数
1
解决办法
6650
查看次数