Android的E /包裹:当解组(仅在三星TAB3)未找到类 [英] Android E/Parcel﹕ Class not found when unmarshalling (only on Samsung Tab3)

查看:709
本文介绍了Android的E /包裹:当解组(仅在三星TAB3)未找到类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直无法解决为什么这个错误发生,并且只有在三星TAB3设备,运行4.4.2?它发生在我MainActivity启动另一个活动,并传递Parcelable类像这样的意图:

 私人无效的DebugTest(TestParcel cfgOptions){
        TestParcel cfgOptions =新TestParcel();
        cfgOptions.setValue(15); //只是为了验证

        意向意图=新的意图(MainActivity.this,TestActivity.class);
        intent.putExtra(cfgOptions,cfgOptions);
        startActivityForResult(意向,DBG_TEST);
    }
 

TestActivity得到parcelable数据,像这样:

 保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.test_activity);

    TestParcel cfgOptions = getIntent()getExtras()getParcelable(cfgOptions)。。;
}
 

类TestParcel:

 进口android.os.Parcel;
    进口android.os.Parcelable;

    公共类TestParcel实现Parcelable {
    私人长l_ucs_value = 0;
    私人字符串s_rx_number =;

    //构造
    公共TestParcel(){
        l_ucs_value = 0;
        s_rx_number =;
    }

    公共无效RxNumber(String s)将{
        s_rx_number =秒;
    }
    公共字符串RxNumber(){
        返回s_rx_number;
    }

    // ------------------------------------------------ -----------------------
    公共无效的setValue(长V){
        v l_ucs_value =;
    }
    众长的getValue(){返回l_ucs_value; }


    保护TestParcel(包裹中){
        l_ucs_value = in.readLong();
        s_rx_number = in.readString();
    }

    @覆盖
    公众诠释describeContents(){
        返回0;
    }

    @覆盖
    公共无效writeToParcel(包裹DEST,INT标志){
        dest.writeLong(l_ucs_value);
        dest.writeString(s_rx_number);
    }

    @燮pressWarnings(未使用)
    公共静态最终Parcelable.Creator< TestParcel> CREATOR =新Parcelable.Creator< TestParcel>(){
        @覆盖
        公共TestParcel createFromParcel(包裹中){
            返回新TestParcel(中);
        }

        @覆盖
        公共TestParcel [] newArray(INT尺寸){
            返回新TestParcel【尺寸】;
        }
    };
}
 

此外,我只看到这个三星TAB3设备上 - 但是这是我们需要它来工作的设备。下面是三星的logcat:

 八月二号至18日:05:55.393 2235年至2571年/? E /包裹?解组时找不到类:com.vms.android.VersatileDEX.TestParcel
抛出java.lang.ClassNotFoundException:com.vms.android.VersatileDEX.TestParcel
        在java.lang.Class.classForName(本机方法)
        在java.lang.Class.forName(Class.java:251)
        在java.lang.Class.forName(Class.java:216)
        在android.os.Parcel.readParcelableCreator(Parcel.java:2133)
        在android.os.Parcel.readParcelable(Parcel.java:2097)
        在android.os.Parcel.readValue(Parcel.java:2013)
        在android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
        在android.os.Bundle.unparcel(Bundle.java:249)
        在android.os.Bundle.getString(Bundle.java:1118)
        在android.content.Intent.getStringExtra(Intent.java:5148)
        在com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1467)
        在com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1063)
        在com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4134)
        在com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4032)
        在android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:159)
        在com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2712)
        在android.os.Binder.execTransact(Binder.java:404)
        在dalvik.system.NativeStart.run(本机方法)
 致:java.lang.NoClassDefFoundError的:COM / VMS /安卓/ VersatileDEX / TestParcel
        在java.lang.Class.classForName(本机方法)
        在java.lang.Class.forName(Class.java:251)
        在java.lang.Class.forName(Class.java:216)
        在android.os.Parcel.readParcelableCreator(Parcel.java:2133)
        在android.os.Parcel.readParcelable(Parcel.java:2097)
        在android.os.Parcel.readValue(Parcel.java:2013)
        在android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
        在android.os.Bundle.unparcel(Bundle.java:249)
        在android.os.Bundle.getString(Bundle.java:1118)
        在android.content.Intent.getStringExtra(Intent.java:5148)
        在com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1467)
        在com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1063)
        在com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4134)
        在com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4032)
        在android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:159)
        在com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2712)
        在android.os.Binder.execTransact(Binder.java:404)
        在dalvik.system.NativeStart.run(本机方法)
 抛出java.lang.ClassNotFoundException:产生的原因没有在路径上找到的类com.vms.android.VersatileDEX.TestParcel:。DexPathList [目录],nativeLibraryDirectories = [/供应商/ lib中/系统/ lib目录] ]
        在dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:67)
        在java.lang.ClassLoader.loadClass(ClassLoader.java:497)
        在java.lang.ClassLoader.loadClass(ClassLoader.java:457)
        在java.lang.Class.classForName(本机方法)
        在java.lang.Class.forName(Class.java:251)
        在java.lang.Class.forName(Class.java:216)
        在android.os.Parcel.readParcelableCreator(Parcel.java:2133)
        在android.os.Parcel.readParcelable(Parcel.java:2097)
        在android.os.Parcel.readValue(Parcel.java:2013)
        在android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
        在android.os.Bundle.unparcel(Bundle.java:249)
        在android.os.Bundle.getString(Bundle.java:1118)
        在android.content.Intent.getStringExtra(Intent.java:5148)
        在com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1467)
        在com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1063)
        在com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4134)
        在com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4032)
        在android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:159)
        在com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2712)
        在android.os.Binder.execTransact(Binder.java:404)
        在dalvik.system.NativeStart.run(本机方法)
 

解决方案

由于一些奇怪的原因,它看起来像类加载器设置不正确。

请尝试以下的 TestActivity.onCreate一()


  TestParcel cfgOptions = getIntent()getParcelableExtra(cfgOptions)。
 


 意向意图= getIntent();
intent.setExtrasClassLoader(TestParcel.class.getClassLoader());
TestParcel cfgOptions = intent.getParcelableExtra(cfgOptions);
 


 捆绑额外= getIntent()getExtras()。
extras.setClassLoader(TestParcel.class.getClassLoader());
TestParcel cfgOptions = extras.getParcelable(cfgOptions);
 


另外,包裹parcelable成束:

 叠B =新包();
b.putParcelable(选项,cfgOptions);
意向意图=新的意图(MDex.this,TestActivity.class);
intent.putExtra(捆绑,B);
 

获得:

 叠B = getIntent()getBundleExtra(捆绑)。
TestParcel cfgOptions = b.getParcelable(选项);
 

I've been unable to resolve why this error occurs, and only on a Samsung Tab3 device, running 4.4.2? It happens when my MainActivity starts another Activity, and passes a Parcelable class in the intent like so:

    private void debugTest(TestParcel cfgOptions){
        TestParcel cfgOptions = new TestParcel();
        cfgOptions.setValue(15); //just to verify

        Intent intent = new Intent(MainActivity.this, TestActivity.class);
        intent.putExtra("cfgOptions", cfgOptions);
        startActivityForResult(intent, DBG_TEST);
    }

TestActivity gets the parcelable data like so:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test_activity);

    TestParcel cfgOptions = getIntent().getExtras().getParcelable("cfgOptions");
}

The class TestParcel:

    import android.os.Parcel;
    import android.os.Parcelable;

    public class TestParcel implements Parcelable {
    private long l_ucs_value = 0;
    private String s_rx_number = "";

    //constructor
    public TestParcel() {
        l_ucs_value = 0;
        s_rx_number = "";
    }

    public void RxNumber(String s) {
        s_rx_number = s;
    }
    public String RxNumber() {
        return s_rx_number;
    }

    //-----------------------------------------------------------------------
    public void setValue(long v){
        l_ucs_value = v;
    }
    public long getValue(){ return l_ucs_value; }


    protected TestParcel(Parcel in) {
        l_ucs_value = in.readLong();
        s_rx_number = in.readString();
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeLong(l_ucs_value);
        dest.writeString(s_rx_number);
    }

    @SuppressWarnings("unused")
    public static final Parcelable.Creator<TestParcel> CREATOR = new Parcelable.Creator<TestParcel>() {
        @Override
        public TestParcel createFromParcel(Parcel in) {
            return new TestParcel(in);
        }

        @Override
        public TestParcel[] newArray(int size) {
            return new TestParcel[size];
        }
    };
}

Again, I only see this on the Samsung Tab3 device - but that's the device we need it to work on. Here's the samsung logcat:

02-18 08:05:55.393    2235-2571/? E/Parcel? Class not found when unmarshalling: com.vms.android.VersatileDEX.TestParcel
java.lang.ClassNotFoundException: com.vms.android.VersatileDEX.TestParcel
        at java.lang.Class.classForName(Native Method)
        at java.lang.Class.forName(Class.java:251)
        at java.lang.Class.forName(Class.java:216)
        at android.os.Parcel.readParcelableCreator(Parcel.java:2133)
        at android.os.Parcel.readParcelable(Parcel.java:2097)
        at android.os.Parcel.readValue(Parcel.java:2013)
        at android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
        at android.os.Bundle.unparcel(Bundle.java:249)
        at android.os.Bundle.getString(Bundle.java:1118)
        at android.content.Intent.getStringExtra(Intent.java:5148)
        at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1467)
        at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1063)
        at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4134)
        at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4032)
        at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:159)
        at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2712)
        at android.os.Binder.execTransact(Binder.java:404)
        at dalvik.system.NativeStart.run(Native Method)
 Caused by: java.lang.NoClassDefFoundError: com/vms/android/VersatileDEX/TestParcel
        at java.lang.Class.classForName(Native Method)
        at java.lang.Class.forName(Class.java:251)
        at java.lang.Class.forName(Class.java:216)
        at android.os.Parcel.readParcelableCreator(Parcel.java:2133)
        at android.os.Parcel.readParcelable(Parcel.java:2097)
        at android.os.Parcel.readValue(Parcel.java:2013)
        at android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
        at android.os.Bundle.unparcel(Bundle.java:249)
        at android.os.Bundle.getString(Bundle.java:1118)
        at android.content.Intent.getStringExtra(Intent.java:5148)
        at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1467)
        at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1063)
        at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4134)
        at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4032)
        at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:159)
        at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2712)
        at android.os.Binder.execTransact(Binder.java:404)
        at dalvik.system.NativeStart.run(Native Method)
 Caused by: java.lang.ClassNotFoundException: Didn't find class "com.vms.android.VersatileDEX.TestParcel" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:67)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
        at java.lang.Class.classForName(Native Method)
        at java.lang.Class.forName(Class.java:251)
        at java.lang.Class.forName(Class.java:216)
        at android.os.Parcel.readParcelableCreator(Parcel.java:2133)
        at android.os.Parcel.readParcelable(Parcel.java:2097)
        at android.os.Parcel.readValue(Parcel.java:2013)
        at android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
        at android.os.Bundle.unparcel(Bundle.java:249)
        at android.os.Bundle.getString(Bundle.java:1118)
        at android.content.Intent.getStringExtra(Intent.java:5148)
        at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1467)
        at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1063)
        at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4134)
        at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4032)
        at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:159)
        at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2712)
        at android.os.Binder.execTransact(Binder.java:404)
        at dalvik.system.NativeStart.run(Native Method)

解决方案

For some strange reason it looks like the class loader isn't set up properly.

Try one of the following in TestActivity.onCreate():


TestParcel cfgOptions = getIntent().getParcelableExtra("cfgOptions");


Intent intent = getIntent();
intent.setExtrasClassLoader(TestParcel.class.getClassLoader());
TestParcel cfgOptions = intent.getParcelableExtra("cfgOptions");


Bundle extras = getIntent().getExtras();
extras.setClassLoader(TestParcel.class.getClassLoader());
TestParcel cfgOptions = extras.getParcelable("cfgOptions");


Alternatively, wrap the parcelable into a bundle:

Bundle b = new Bundle();
b.putParcelable("options", cfgOptions);
Intent intent = new Intent(MDex.this, TestActivity.class);
intent.putExtra("bundle", b);

to get:

Bundle b = getIntent().getBundleExtra("bundle");
TestParcel cfgOptions = b.getParcelable("options");

这篇关于Android的E /包裹:当解组(仅在三星TAB3)未找到类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆