草庐IT

android - 解码父 View SavedState 时恢复 View SavedState 抛出 ClassNotFoundException

coder 2023-12-06 原文

我有 2 个类 ParentClassChildClass:

ParentClass 是 RelativeLayout 的子类,它使用以下代码使用 onSaveInstanceState()/onRestoreInstanceState() 保存状态:

@Override
protected Parcelable onSaveInstanceState() {
    SavedState savedState = new SavedState(super.onSaveInstanceState());
    savedState.someObj = someObj;
    savedState.someInt = someInt;
    savedState.someEnum = someEnum;
    return savedState;
}

@Override
protected void onRestoreInstanceState(Parcelable in) {
    if (!(in instanceof SavedState)) {
        super.onRestoreInstanceState(in);
        return;
    }
    SavedState savedState = (SavedState) in;
    super.onRestoreInstanceState(savedState.getSuperState());
    this.someObj = savedState.someObj;
    this.someInt = savedState.someInt;
    this.someEnum = savedState.someEnum;
}

这里是 SavedState 代码:

public static class SavedState extends BaseSavedState {

    private SomeObj someObj;
    private int someInt;
    private SomeEnum someEnum;

    public SavedState(Parcelable superState) {
        super(superState);
    }

    public SavedState(Parcel source) {
        super(source);
        someInt = source.readInt();
        someEnum = SomeEnum.values()[source.readInt()];
        someObj = source.readParcelable(SomeObj.class.getClassLoader());
    }

    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        super.writeToParcel(dest, flags);
        dest.writeInt(someInt);
        dest.writeInt(someEnum.ordinal());
        dest.writeParcelable(someObj, flags);
    }

    public static final Creator<SavedState> CREATOR = new Creator<SavedState>() {
        public SavedState createFromParcel(Parcel in) {
            return new SavedState(in);
        }

        public SavedState[] newArray(int size) {
            return new SavedState[size];
        }
    };
}

没什么特别的,当我直接使用这个 View 时,一切都按预期工作(保存\恢复状态)。

然后我有 ChildClass 扩展 ParentClass 它还使用完全相同的代码保存它的状态,只是我只保存 long 和 int 字段。

当应用程序尝试通过使用 CREATORParcel 调用它的 SavedState 构造函数来恢复 ChildClass View 状态时使用以下堆栈崩溃:

Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.company.app.ParentClass$SavedState
1   android.os.Parcel.readParcelableCreator Parcel.java, line 2320
2   android.os.Parcel.readParcelable    Parcel.java, line 2270
3   android.view.AbsSavedState.<init>   AbsSavedState.java, line 57
4   android.view.View$BaseSavedState.<init> View.java, line 20128
5   com.company.app.ChildClass$SavedState.<init>    ChildClass.java, line 151
6   com.company.app.ChildClass$SavedState$1.a   ChildClass.java, line 166
7   com.company.app.ChildClass$SavedState$1.createFromParcel ChildClass.java, line 164

最佳答案

让你的SavedState类实现Parcelable

public static class SavedState extends Parcelable {

关于android - 解码父 View SavedState 时恢复 View SavedState 抛出 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29625545/

有关android - 解码父 View SavedState 时恢复 View SavedState 抛出 ClassNotFoundException的更多相关文章

  1. ruby - 在 Ruby 中重新分配常量时抛出异常? - 2

    我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案

  2. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  3. ruby-on-rails - Rails - Carrierwave 进程抛出 ArgumentError : no images in this image list - 2

    在尝试实现应用auto_orient的过程之后!对于我的图片,我收到此错误:ArgumentError(noimagesinthisimagelist):app/uploaders/image_uploader.rb:36:in`fix_exif_rotation'app/controllers/posts_controller.rb:12:in`create'Carrierwave在没有进程的情况下工作正常,但在添加进程后尝试上传图像时抛出错误。流程如下:process:fix_exif_rotationdeffix_exif_rotationmanipulate!do|image|

  4. ruby - Rails+ActiveAdmin - 使用 ransacker 过滤会抛出错误 PG::SyntaxError: ERROR: syntax error at or near "," - 2

    我在RubyonRails4.1.4上有一个项目,使用来自git://github.com/activeadmin/activeadmin的activeadmin1.0.0.pre,pg0.17.1,PostgreSQL9.3在项目中我有这些模型:类用户has_one:账户类账户属于:用户有很多:project_accountshas_many:项目,:through=>:project_accounts类项目#该项目有一个bool属性'archive'has_many:project_accounts类ProjectAccount属于:帐户属于:项目我有一个任务是在索引页面上实现一个

  5. ruby - 你如何断言另一个 ruby​​ 模块的异常被抛出? (使用 assert_throws) - 2

    我正在尝试编写这样的代码:assert_throws(:ExtractionFailed){unit.extract_from('5x2005')}ExtractionFailed是Exception的一个简单子(monad)类,在test/unit下,我试图断言它在我调用unit.extract_from(...坏数据...)我已经将ExtractionFailed移动到SemanticText模块中,所以现在test/unit说:expectedtobethrownbutwasthrown.我尝试编写assert_throws(:SemanticText::ExtractionFa

  6. ruby - 为什么 Ruby 在抛出 NameError 异常后仍保留代码求值? - 2

    我无法向自己解释的简单代码:putsaifa=1这导致warning:found=inconditional,shouldbe==NameError:undefinedlocalvariableormethod'a'formain:Object不过,现在检查a我们可以看到,它已被定义:a#=>1尽管抛出异常,为什么a仍被分配给1?来自docs:Theconfusioncomesfromtheout-of-orderexecutionoftheexpression.Firstthelocalvariableisassigned-tothenyouattempttocallanonexis

  7. jquery - Rack 抛出 EOFError(错误的内容正文) - 2

    我们使用Ruby2.1.2、Rails3.2.19和JQuery1.11,未使用Assets管道(因此未使用JQuery-ujs,但明确使用相关的rails.js)。对于大多数用户来说,JQuery和其他相关的常用插件都是从GoogleCDN中提取的(包括jquery.form3.50)。受影响的网络服务器是Ubuntu14.04、Nginx1.6和Passenger4.x。对于我们生产服务器上大约10%的用户(负载似乎无关紧要),我们得到了这样的堆栈转储,主要针对一个URL,但也有其他URL:/gems/rack-1.4.5/lib/rack/multipart/parser.rb:

  8. ruby-on-rails - bundle exec rake 测试抛出错误 - 2

    你好,我是铁路新手。我正在关注MichaelHartl的railstutorial.org。我卡在了第4章的list4.5中:当我点击$bundleexecraketest时,它显示的结果与按照教程应该显示的结果不同。注意:我使用的是Ubuntu15.10作为平台。当我点击$bundleexecraketest时的结果/home/shyambhimani/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/minitest-reporters-1.0.5/lib/minitest/minitest_reporter_plugin.rb:8:in

  9. ruby-on-rails - JSON解码参数问题 - 2

    我有一个使用postgresql的Rails4应用程序。我还有一个backbone.js应用程序,可将JSON推送到Rails4应用程序。这是我的Controller:defcreate@product=Product.new(ActiveSupport::JSON.decodeproduct_params)respond_todo|format|if@product.saveformat.json{renderaction:'show',status::created,location:@product}elseformat.json{renderjson:@product.erro

  10. ruby - 警告 : RubyGems 1. 找不到 2+ 索引:RubyGems 将恢复到降低性能的旧索引 - 2

    警告:找不到RubyGems1.2+索引:RubyGems将恢复到降低性能的遗留索引。如果有人能帮我解决这个问题,我会给他们50.00美元我用尽了谷歌,重新安装了所有东西。我只想做gem安装...就是这样 最佳答案 删除罪魁祸首URL。就我而言,我使用的是Centos5.4,我收到的完整错误消息是:root#geminstallrackWARNING:RubyGems1.2+indexnotfoundfor:http://rubyworks.rubyforge.org/redhat/5/GEMS/x86_64/RubyGemswil

随机推荐