将数据传递给活动

时间:2012-08-17 16:59:54

标签: android android-intent

我正在开发一个应用程序,当我按下按钮时,下载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,则没有问题。

dati的问题是什么?


---这里改了因为我无法回复自己---

好,朋友们。谢谢你的回复!
我的猜测是我需要重新设计应用数据。

我的第一次尝试是:下载XML文本并将数据容纳到(相当)复杂的对象中。该对象包含一个锦标赛列表,每个锦标赛都包含一个类别列表,每个类别都包含一个团队列表。

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

还有其他想法吗?

5 个答案:

答案 0 :(得分:1)

Extract from this Answer :

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

Parcelable 是一个Android专用界面,您可以自行实现序列化。它的创建效率远远高于Serializable,并且可以解决默认Java序列化方案的一些问题。

Extract from this answer

  

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

在StackOverFlow上看到一些答案后,我得出结论,Parcelable优于android中的Serialization。

如何使类成为Parcelable? (查看thisthisthis教程)

答案 1 :(得分: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;

}

答案 2 :(得分:0)

Intent类的方法为

putExtra(String name, int value)

这就是为什么当你把12345放在“value”的地方时它可以工作,但是没有带有“DatiSport”对象的putExtra的重载版本。 您必须确保“DatiSport”是Serializable或Parcelable。

有关详情,请参阅下文 -

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

How to send an object from one Android Activity to another using Intents?

How to pass an object from one activity to another on Android

答案 3 :(得分:0)

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

将数据从一个活动传递到另一个活动:

intent.putExtra("ClassName", obj); 

在第一个活动的第二个活动中检索数据

getIntent().getSerializableExtra("ClassName");

答案 4 :(得分:0)

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

非常感谢