First time asking something. Right now im trying to send a HashSet to another activity.
So what i did is this:
I made Item parcelable. Its just a class containing a string so the methods to pack and unpack the parcel are not included.
I made ItemList parcelable. Its a Class containing a HashSet , some UUIDs and a String.
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);
}
}