0

First time asking something. Right now im trying to send a HashSet to another activity.

So what i did is this:

  1. I made Item parcelable. Its just a class containing a string so the methods to pack and unpack the parcel are not included.

  2. I made ItemList parcelable. Its a Class containing a HashSet , some UUIDs and a String.

  3. Made some Methods to pack a HashSet into a Parcelable[] and vice versa.

Here is the code:

Method for packing the HashSet

    private Parcelable[] hashSetToParcelableArray(HashSet<Item> items) {
        if (items != null && !items.isEmpty()) {
            Parcelable[] parcelables = new Parcelable[items.size()];
            int index = 0;
            for (Item item : items) {
                parcelables[index] = item;
                index++;
            }
            return parcelables;
        } else return new Parcelable[0];
    }

Method for unpacking the HashSet

    private HashSet<Item> parcelableArrayToHashSet(Parcelable[] parcelables) {
        if (parcelables != null && parcelables.length != 0) {
            HashSet<Item> items = new HashSet<>();
            for (int i = 0; i < parcelables.length; i++) {
                items.add((Item) parcelables[i]);
            }
            return items;
        } else return new HashSet<Item>();
    }

So it always fails here. To be exact at the first line with the classloader. This kindof makes sense because the error is a ClassNotFoundException. But i dont know why i get the error.

protected ItemList(Parcel in) {
        this.set = parcelableArrayToHashSet(in.readParcelableArray(ItemList.class.getClassLoader()));
        this.listUuid = UUID.fromString(in.readString());
        this.creatorUuid = UUID.fromString(in.readString());
        this.name = in.readString();
    }

Debugger:

    E/Parcel: Class not found when unmarshalling: 
    java.lang.ClassNotFoundException: Invalid name: 
        at java.lang.Class.classForName(Native Method)
        at java.lang.Class.forName(Class.java:454)
        at android.os.Parcel.readParcelableCreator(Parcel.java:3338)
        at android.os.Parcel.readParcelable(Parcel.java:3272)
        at android.os.Parcel.readParcelableArray(Parcel.java:3398)
        at com.elevencent.myapplication.ItemList.<init>(ItemList.java:99)
        at com.elevencent.myapplication.ItemList$1.createFromParcel(ItemList.java:108)
        at com.elevencent.myapplication.ItemList$1.createFromParcel(ItemList.java:105)
        at android.os.Parcel.readParcelable(Parcel.java:3281)
        at android.os.Parcel.readValue(Parcel.java:3174)
        at android.os.Parcel.readArrayMapInternal(Parcel.java:3567)
        at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:292)
        at android.os.BaseBundle.unparcel(BaseBundle.java:236)
        at android.os.Bundle.getParcelable(Bundle.java:1001)
        at android.content.Intent.getParcelableExtra(Intent.java:8276)
        at com.elevencent.myapplication.ShoppingListActivity.onCreate(ShoppingListActivity.java:22)
        at android.app.Activity.performCreate(Activity.java:7994)
        at android.app.Activity.performCreate(Activity.java:7978)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.elevencent.myapplication, PID: 12185
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.elevencent.myapplication/com.elevencent.myapplication.ShoppingListActivity}: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
     Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: 
        at android.os.Parcel.readParcelableCreator(Parcel.java:3364)
        at android.os.Parcel.readParcelable(Parcel.java:3272)
        at android.os.Parcel.readParcelableArray(Parcel.java:3398)
        at com.elevencent.myapplication.ItemList.<init>(ItemList.java:99)
        at com.elevencent.myapplication.ItemList$1.createFromParcel(ItemList.java:108)
        at com.elevencent.myapplication.ItemList$1.createFromParcel(ItemList.java:105)
        at android.os.Parcel.readParcelable(Parcel.java:3281)
        at android.os.Parcel.readValue(Parcel.java:3174)
        at android.os.Parcel.readArrayMapInternal(Parcel.java:3567)
        at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:292)
        at android.os.BaseBundle.unparcel(BaseBundle.java:236)
        at android.os.Bundle.getParcelable(Bundle.java:1001)
        at android.content.Intent.getParcelableExtra(Intent.java:8276)
        at com.elevencent.myapplication.ShoppingListActivity.onCreate(ShoppingListActivity.java:22)
        at android.app.Activity.performCreate(Activity.java:7994)
        at android.app.Activity.performCreate(Activity.java:7978)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:223) 
        at android.app.ActivityThread.main(ActivityThread.java:7656) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 
I/Process: Sending signal. PID: 12185 SIG: 9
Disconnected from the target VM, address: 'localhost:63144', transport: 'socket'

EDIT Here is the full ItemList.java (As you can see i already tried to call the Item.class.getClassLoader after posting here, didnt work)

package com.elevencent.myapplication;

import android.os.Parcel;
import android.os.Parcelable;
import java.util.HashSet;
import java.util.UUID;

/**
 * Class that holds all information about the shoppinglist and its contents.
 *
 * @author Pieter Vogt
 * @since 09.09.2021
 */
public class ItemList implements Parcelable {
    private final HashSet<Item> set;
    private final UUID listUuid;
    private final UUID creatorUuid;
    private final String name;
    
    /**
     * Constructor for ItemList.
     *
     * @param creatorUuid The uuid that represents the User that created the ItemList.
     *
     * @author Pieter Vogt
     * @since 09.09.2021
     */
    public ItemList(String name, UUID creatorUuid) {
        this.name = name;
        this.set = new HashSet<>();
        this.listUuid = UUID.randomUUID();
        this.creatorUuid = creatorUuid;
    }
    
    /**
     * Creates a HashSet of items out of an Array of Parcelables.
     * <p>
     * This is used for unpacking the parcelable array to use it in another activity.
     *
     * @param parcelables Array of items to use in another activity.
     *
     * @return HashSet of items.
     *
     * @author Pieter Vogt
     * @since 09.09.2021
     */
    private HashSet<Item> parcelableArrayToHashSet(Parcelable[] parcelables) {
        //Order to write or read into/out of parcel: set, listUuid, creatorUuid, name
        if (parcelables != null && parcelables.length != 0) {
            HashSet<Item> items = new HashSet<>();
            for (Parcelable parcelable : parcelables) {
                items.add((Item) parcelable);
            }
            return items;
        } else return new HashSet<>();
    }
    
    /**
     * Creates an array of parcelables out of an hashset of items.
     * <p>
     * This is used for packing the hashset for later use in another activity.
     *
     * @param items Hashset of items.
     *
     * @return Array of parcelables.
     *
     * @author Pieter Vogt
     * @since 09.09.2021
     */
    private Parcelable[] hashSetToParcelableArray(HashSet<Item> items) {
        //Order to write or read into/out of parcel: set, listUuid, creatorUuid, name
        if (items != null && !items.isEmpty()) {
            Parcelable[] parcelables = new Parcelable[items.size()];
            int index = 0;
            for (Item item : items) {
                parcelables[index] = item;
                index++;
            }
            return parcelables;
        } else return new Parcelable[0];
    }
    
    protected ItemList(Parcel in) {
        this.set = (HashSet<Item>) parcelableArrayToHashSet(in.readParcelableArray(Item.class.getClassLoader()));
        this.listUuid = UUID.fromString(in.readString());
        this.creatorUuid = UUID.fromString(in.readString());
        this.name = in.readString();
    }
    
    public static final Creator<ItemList> CREATOR = new Creator<ItemList>() {
        @Override
        public ItemList createFromParcel(Parcel in) {
            return new ItemList(in);
        }
        
        @Override
        public ItemList[] newArray(int size) {
            return new ItemList[size];
        }
    };
    
    /**
     * Getter for HashSet.
     *
     * @return HashSet that contains all the Items.
     *
     * @author Pieter Vogt
     * @since 09.09.2021
     */
    public HashSet<Item> getSet() {
        return set;
    }
    
    /**
     * Getter for UUID of List.
     *
     * @return UUID of the ItemList.
     *
     * @author Pieter Vogt
     * @since 09.09.2021
     */
    public UUID getListUuid() {
        return listUuid;
    }
    
    /**
     * Getter for UUID of creator.
     *
     * @return UUID of the creator of the ItemList.
     *
     * @author Pieter Vogt
     * @since 09.09.2021
     */
    public UUID getCreatorUuid() {
        return creatorUuid;
    }
    
    public String getName() {
        return name;
    }
    
    @Override
    public int describeContents() {
        return 0;
    }
    
    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeTypedArray(hashSetToParcelableArray(set), i);
        parcel.writeString(listUuid.toString());
        parcel.writeString(creatorUuid.toString());
        parcel.writeString(name);
    }
}

1 Answers1

0

By looking at this part:

this.set = parcelableArrayToHashSet(in.readParcelableArray(ItemList.class.getClassLoader()));
    

It seems you want to parse it using ItemList class. However when you create the list it is using Item class.

Maybe you can provide more information, whether ItemList class exist or not in your project?

gertas
  • 16,869
  • 1
  • 76
  • 58
VRT
  • 1
  • 1