我正在开发一个应用程序,当我按下按钮时,下载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文本直接传递给其他活动(他们必须依次显示锦标赛列表,然后是所选锦标赛的类别,然后是所选类别的团队列表......)
还有其他想法吗?
答案 0 :(得分:1)
Serializable
是标准的Java界面。您只需通过实现接口来标记Serializable类,Java将在某些情况下自动序列化它。
Parcelable
是一个Android专用界面,您可以自行实现序列化。它的创建效率远远高于Serializable,并且可以解决默认Java序列化方案的一些问题。
看到Parcelable可能引发了一个问题,为什么是Android 不使用内置的Java序列化机制?事实证明 Android团队得出了Java中的序列化结论 太慢了,无法满足Android的进程间通信 要求。因此团队构建了Parcelable解决方案。该 Parcelable方法要求您显式序列化成员 你的班级,但最终,你获得了更快的序列化 你的对象。
在StackOverFlow上看到一些答案后,我得出结论,Parcelable优于android中的Serialization。
答案 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。
有关详情,请参阅下文 -
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错误和类的名称!!
现在我检查了每个内部类,数据被传递给下一个活动。
非常感谢