如何在Android Lollipop版本中的Parcelable类内添加保留Class <?>对象

如何在Android Lollipop版本中的Parcelable类内添加保留Class <?>对象,第1张

概述将Parcelable数据从一个活动发送到另一个活动时遇到问题.MYQUESTION:Isitpossibletoadd/keepClass<?>objectinsideaParcelableclasswhichhastobesenttoanotherActivity?IfpossiblethenhowcanIachieveit?我已经尝试过这样做,但是在Android5.0、5.

将Parcelable数据从一个活动发送到另一个活动时遇到问题.

MY QUESTION: Is it possible to add/keep Class<?> object insIDe a Parcelable class which has to be sent to another Activity? If possible then how can I achIEve it?

我已经尝试过这样做,但是在Android 5.0、5.1和5.1.1版本中遇到以下异常:

我的LOGCAT:

04-14 14:58:36.838: E/AndroIDRuntime(31164): FATAL EXCEPTION: main04-14 14:58:36.838: E/AndroIDRuntime(31164): Process: com.example, PID: 3116404-14 14:58:36.838: E/AndroIDRuntime(31164): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.v2.BaseAct}: java.lang.RuntimeException: Parcelable encountered ClassNotFoundException reading a Serializable object (name = java.lang.class)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.app.ActivityThread.performlaunchActivity(ActivityThread.java:2325)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.app.ActivityThread.access0(ActivityThread.java:151)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.os.Handler.dispatchMessage(Handler.java:102)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.os.Looper.loop(Looper.java:135)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.app.ActivityThread.main(ActivityThread.java:5254)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at java.lang.reflect.Method.invoke(Native Method)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at java.lang.reflect.Method.invoke(Method.java:372)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at com.androID.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:698)04-14 14:58:36.838: E/AndroIDRuntime(31164): Caused by: java.lang.RuntimeException: Parcelable encountered ClassNotFoundException reading a Serializable object (name = java.lang.class)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.os.Parcel.readSerializable(Parcel.java:2384)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.os.Parcel.readValue(Parcel.java:2203)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at com.example.template.HomeItemCls.readFromParcel(HomeItemCls.java:251)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at com.example.template.HomeItemCls.<init>(HomeItemCls.java:213)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at com.example.template.HomeItemCls.createFromParcel(HomeItemCls.java:260)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at com.example.template.HomeItemCls.createFromParcel(HomeItemCls.java:1)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.os.Parcel.readParcelable(Parcel.java:2252)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.os.Parcel.readValue(Parcel.java:2152)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.os.Parcel.readListInternal(Parcel.java:2526)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.os.Parcel.readArrayList(Parcel.java:1842)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.os.Parcel.readValue(Parcel.java:2173)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.os.Parcel.readArrayMAPInternal(Parcel.java:2485)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.os.BaseBundle.unparcel(BaseBundle.java:221)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.os.BaseBundle.containsKey(BaseBundle.java:269)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.content.Intent.hasExtra(Intent.java:4879)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at com.example.v2.BaseAct.onCreate(BaseAct.java:184)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.app.Activity.performCreate(Activity.java:5990)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.app.ActivityThread.performlaunchActivity(ActivityThread.java:2278)04-14 14:58:36.838: E/AndroIDRuntime(31164):    ... 10 more04-14 14:58:36.838: E/AndroIDRuntime(31164): Caused by: java.lang.classNotFoundException: com.example.v2.fragment.songListFragment04-14 14:58:36.838: E/AndroIDRuntime(31164):    at java.lang.class.classForname(Native Method)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at java.lang.class.forname(Class.java:309)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.os.Parcel.resolveClass(Parcel.java:2370)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at java.io.ObjectinputStream.readNewClassDesc(ObjectinputStream.java:1641)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at java.io.ObjectinputStream.readClassDesc(ObjectinputStream.java:657)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at java.io.ObjectinputStream.readNewClass(ObjectinputStream.java:1512)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at java.io.ObjectinputStream.readNonPrimitiveContent(ObjectinputStream.java:755)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at java.io.ObjectinputStream.readobject(ObjectinputStream.java:1983)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at java.io.ObjectinputStream.readobject(ObjectinputStream.java:1940)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at androID.os.Parcel.readSerializable(Parcel.java:2378)04-14 14:58:36.838: E/AndroIDRuntime(31164):    ... 28 more04-14 14:58:36.838: E/AndroIDRuntime(31164): Caused by: java.lang.classNotFoundException: com.example.v2.fragment.songListFragment04-14 14:58:36.838: E/AndroIDRuntime(31164):    at java.lang.class.classForname(Native Method)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at java.lang.BootClassLoader.findClass(ClassLoader.java:781)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)04-14 14:58:36.838: E/AndroIDRuntime(31164):    at java.lang.classLoader.loadClass(ClassLoader.java:469)04-14 14:58:36.838: E/AndroIDRuntime(31164):    ... 38 more04-14 14:58:36.838: E/AndroIDRuntime(31164): Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

我的密码:

public class HomeItemCls implements Parcelable{    private Class<?> itemActivity;    private Class<?> itemFragment;    public Class<?> getItemActivity()    {        return itemActivity;    }    public voID setItemActivity(Class<?> itemActivity)    {        this.itemActivity = itemActivity;    }    public voID setItemFragment(Class<?> itemFragment)    {        this.itemFragment = itemFragment;    }    public Class<?> getItemFragment()    {        return itemFragment;    }    public HomeItemCls()    {        // Todo auto-generated constructor stub    }    public HomeItemCls(Parcel in)    {        readFromParcel(in);    }    @OverrIDe    public int describeContents()    {        // Todo auto-generated method stub        return 0;    }    @OverrIDe    public voID writetoParcel(Parcel dest, int flags)    {        // Todo auto-generated method stub        dest.writeValue(getItemFragment());        dest.writeValue(getItemActivity());    }    @SuppressWarnings("unchecked")    private voID readFromParcel(Parcel in)    {        // Todo auto-generated method stub        setItemFragment((Class<?>) in.readValue(Class.class.getClassLoader()));        setItemActivity((Class<?>) in.readValue(Class.class.getClassLoader()));    }    @SuppressWarnings("rawtypes")    public static final Parcelable.Creator CREATOR = new Parcelable.Creator()    {        public HomeItemCls createFromParcel(Parcel in)        {            return new HomeItemCls(in);        }        public HomeItemCls[] newArray(int size)        {            return new HomeItemCls[size];        }    };}

解决方法:

由于Class实现了Serializable而不是Parcelable,因此您不能使用readValue / writeValue对(这些是Parcelable函数).

因此,您应该使用writeSerializable / readSerializable对(这些是Serializable函数).使用readSerializable,您必须将返回值转换为特定类型.

(可选)您还应该更改

类<?> itemFragment;

类&lt ;?延伸Fragment> itemFragment ;,

私人Class<?> itemActivity;

私人班级&lt ;?扩展Activity> itemActivity;

总结

以上是内存溢出为你收集整理的如何在Android Lollipop版本中的Parcelable类内添加/保留Class <?>对象全部内容,希望文章能够帮你解决如何在Android Lollipop版本中的Parcelable类内添加/保留Class <?>对象所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1078750.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存