具有可分配的子对象的自定义对象的ClassCastException

时间:2017-09-21 16:01:30

标签: java android

美好的一天,

我被分配到公司内部的一个Android项目,我有点挣扎。几年后我没有触及过Android。想你可能能帮我找到我所缺少的东西。

我有一个项目调用外部库来读取条形码,然后代码对字节数组进行解析并将其转换为对象。我遇到的问题是我的MainActivity和扫描条形码的活动之间的通信。

这是调用我的条形码阅读器活动的代码:

    setContentView(R.layout.activity_main);


    MyObjectActivity.setParentActivity(this);
    Intent intent = new Intent(this, MyObjectActivity.class);
    startActivityForResult(intent, 0);

这个应该将扫描数据从MyObjectActivity对象升级到我的MainActivity(所以我实际上可以对数据做些什么)。

try
        {
        //MyObject objet contains child objects
            MyObject content = MyObjectParser.retrieveContentData(data /*contains the byte array*/);
            Intent data_toreturn = new Intent();
            data_toreturn.putExtra("data_sent", true);
            data_toreturn.putExtra(BARCODE_DATA_EXTRA_TAG, content);

            if (getParent() == null)
            {                
                setResult(RESULT_OK, data_toreturn);
            } else
                getParent().setResult(RESULT_OK, data_toreturn);
        } catch(final RuntimeException e)
        {
            parentActivity.runOnUiThread(new Runnable()
            {
                @Override
                public void run()
                {
                    Toast.makeText(parentActivity, e.getMessage(), Toast.LENGTH_LONG).show();
                }
            });
        }

        // stop the Activity
        finish();

调试时我设法运行所有代码直到完成()。然后我得到了例外

将结果ResultInfo {who = null,request = 0,result = -1,data = Intent {(has extras)}}传递给activity {MyObjectActivity}:java.lang.ClassCastException:java.lang.Object []无法转换为ChildObject []

根据我在android中开发的记忆,为了能够在活动之间传递对象,你需要意图和可以Parcelable或Serializable的对象(不确定这个)。我已经审查了代码和子对象DO实现这一点。

我真的不知道如何继续。这可能是一个配置,或者我做了一些非常错误的事情,我没有看到它。

感谢您的回复。

2 个答案:

答案 0 :(得分:1)

所以我看到你正在使用

startActivityForResult(intent,Yournumber)//我不会使用0,使用1001或更多自定义。 这样你就可以成为已发布活动的父级。 那你为什么要做setParentActivity调用呢?我假设你做的吐司?似乎是处理这种情况的不健康方式,但这是一个不同的问题。

然后覆盖该父活动中的onActivityResult以处理返回的intent数据。我相信你已经完成了。

但我不确定你的“内容”对象,如果它是可以包容的。您可以通过简单地注释掉“将其添加到意图”并查看当该对象不在意图内时它是否被传递来进行检查。

如果它被传递,那么你应该确保你的对象实现Parceable,以便它可以放入意图中。如果仍然没有交付,那么看起来你的父母没有以某种方式指向正确的类有问题,我们需要看到更多的代码来帮助解决这个问题。

我看到你正在传递原始字节,这应该可以正常工作,但你可以尝试一个包装器对象,它实现了parceable,它将字节保存为成员,并将该对象作为最后的沟通工具传回。 / p>

答案 1 :(得分:0)

假设您通过活动A中的显式意图向活动B发送对象X.

第1步 - 确保您的类X实现Serializable接口(您说已经拥有)。还要确保Object X中的所有其他对象都实现了Serializable接口。

第2步 - 在您的活动A中的某个地方,您有类似的代码:

X objectX = new X();
Intent intent = new Intent(A.this, B.class);
intent.putExtra("myObject", objectX);
startActivity(intent);

步骤3 - 在您的活动B中,您将获得Object引用并将其转换为X:

Intent intent = getIntent();
X objectX = (X)intent.getSerializableExtra("myObject");

希望这会有所帮助。这是在活动之间传递对象的基本模式,没有更多内容。