1

我正在开发一个应用程序,当我按下按钮时,它会下载 XML 文件,将 xml 数据放入自定义对象并将其传递给第二个活动。
问题是出了点问题:当调用该startActivity()函数时,应用程序崩溃并出现运行时错误。我的代码是:

public void onClickBtn1(View view)
{
    final ProgressDialog dlg = ProgressDialog.show( this, "Data wait", "Waiting data from the site ..");

    // Thread to wait data
    Thread th = new Thread() {

        public void run() {

            // Download and parse xml data
            final DatiSport dati = new DatiSport();
            boolean ret = dati.download();
            dlg.dismiss();

            // check result
            if (ret==true)
            {
                // -- Ok
                handlerUI.post( new Runnable() {

                    public void run() {
                        Intent intSec = new Intent(AICSActivity.this, SportActivity.class);
                        intSec.putExtra("datiSport", dati);
                        startActivity(intSec);
                    }
                });
            }
            else
            {

startActivity()应用程序在通话时崩溃。当我断线时,startActivity()我无法查看名为“dati”的变量,我猜这定义不明确。
如果我用 12345 代替 dati,就没有问题。

数据的问题是什么?


--- 此处更改,因为我无法回复自己 ---

好了朋友们。感谢您的回复!
我的猜测是我需要重新设计应用程序数据。

我的第一次尝试是:下载 XML 文本并将数据放入(相当)复杂的对象中。这个对象包含一个冠军列表,每个冠军都包含一个类别列表,每个类别都包含一个团队列表。

问题是,由于 Serializable 不起作用,Parcelable 的实现过于复杂,它应该生成与 xml 文件几乎相同的数据。
我想知道直接将xml文本传递给其他活动是否应该更容易(他们必须依次显示冠军列表,然后是所选冠军的类别,然后是所选类别的球队列表......)

还有什么想法吗?

4

5 回答 5

1

从这个答案中提取:

Serializable是一个标准的Java接口。您只需通过实现接口标记一个类 Serializable,Java 会在某些情况下自动序列化它。

Parcelable是您自己实现序列化的 Android 特定接口。它的创建比 Serializable 更有效,并解决了默认 Java 序列化方案的一些问题。

从这个答案中提取

看到 Parcelable 可能会引发一个问题,为什么 Android 不使用内置的 Java 序列化机制?事实证明,Android 团队得出的结论是,Java 中的序列化速度太慢,无法满足 Android 的进程间通信要求。因此,该团队构建了 Parcelable 解决方案。Parcelable 方法要求您显式序列化类的成员,但最终,您可以更快地序列化对象。

在 StackOverFlow 上看到一些答案后,我得出结论 Parcelable 比 android 中的序列化进行了优化。

如何使类到 Parcelable ?(看看这个这个这个教程)

于 2012-08-17T17:24:32.210 回答
0

我发现问题了!!!
内部类没有实现可序列化!
在转储窗口中,我看到了内部对象“ioe”,它表示存在 NotSerializable 错误和类的名称!!
现在我检查了每个内部类并将数据传递给下一个活动。

非常感谢

于 2012-08-20T20:23:19.523 回答
0

传递对象时使用 Serializable 或 Parcelable

您需要一个类来实现 Serializable 类

//to pass :
intent.putExtra("MyClass", obj);  

// to retrieve object in second Activity
getIntent().getSerializableExtra("MyClass");

你的课看起来像这样;

import java.io.Serializable;

@SuppressWarnings("serial") //with this annotation we are going to hide compiler warning
public class MyClass implements Serializable {

public Deneme(Object obj){
    this.obj= obj;
}
private Object obj;

}
于 2012-08-17T17:05:13.113 回答
0

Intent 类有一个方法为

putExtra(String name, int value)

这就是为什么当您将 12345 放在“值”位置时它可以工作的原因,但是 putExtra 没有采用“DatiSport”对象的重载版本。您必须确保“DatiSport”是可序列化或可打包的。

有关更多信息,请参见下文 -

http://developer.android.com/reference/android/content/Intent.html#putExtra%28java.lang.String,%20java.io.Serializable%29

如何使用 Intents 将对象从一个 Android Activity 发送到另一个?

如何在Android上将对象从一个活动传递到另一个活动

于 2012-08-17T17:13:22.567 回答
0

让你的类实现Serializable接口,然后在intent extra中传递对象实例。

要将数据从一个 Activity 传递到另一个:

intent.putExtra("ClassName", obj); 

要从第一个活动中检索第二个活动中的数据:

getIntent().getSerializableExtra("ClassName");
于 2012-08-17T17:23:54.310 回答