2011-11-30 153 views
0

我需要在活动之间传递我的对象列表。我不想每次都使用parcelable或序列化数据。我也不想将它保存在本地文件或数据库中。这可能使我使用静态对象。在活动之间传递/使用非原始对象

可以说我在活动Activity1到Activity2之间使用ListA。方法1:在其中一个活动中创建一个静态ListA,并完成所有静态ListA的工作。

方法2:在另一个类中创建一个静态列表,我只用它来存储这个列表并在列表中完成所有的东西。但是这意味着只要我的进程正在运行,它就会一直存在,而当我不需要它时,我必须手动将其设置为空。

方法3。我正在扩展上面的类来使用静态HashMap来实现它。 我有两种方法之一,使用唯一键将静态HashMap中的列表存储起来,另一种方法是检索列表并在每次检索数据时将其删除,以便List不再出现在静态HashMap中。所以我们必须只传递生成的随机密钥来存储活动之间的数据,我可以使用Intents作为额外的数据传递。

当我使用上述任何一种方法时,会有什么问题,哪种方法最好。

回答

1

Uggg statics!我希望所有的开发人员都明白全局变量是不好的,他们是如何让你的程序变得更脆弱的,以及你的人生如何。我们一直在谈论他们30多年来有多糟糕,但不幸的是,除非他们完全沉浸在他们身上,否则没有人会想到这一点。

首先我会说序列化你的数据很快。有很好的工具可以快速序列化你的对象,你可以使用我喜欢的http://flexjson.sourceforge.net

所以,如果你只是彻底反对这一点,你可以通过继承它,声明你实现你的Android清单通过应用程序通过这个对象,每个活动都有访问应用实例:

public class MyActivity extends Activity { 
    public void onCreate(Bundle bundle) { 
     MyApplication application = (MyApplication)getApplication(); 
     Object anInstanceFromAnotherActivity = application.getSomeInput(); 
    } 
} 

这个缺点是当你的应用程序被回收,如果用户返回到你的应用程序的内存已经消失,并且你不能得到你可能需要的屏幕输入。 Android框架试图让你序列化包中的东西,因为如果它决定销毁你的应用程序,你总是可以从包中重建自己。现在有些捷径可以像重定向人员重新开始,如果应用程序已被回收,但是这些捷径取决于您的程序以及它们在有意义时的行为。

这就是使用序列化胜过所有其他形式的持久性(可添加,文件,数据库)的地方,因为它可以在一行代码中完成。

+0

+1为你的第一段“Uggg statics!...”无论如何可以说我想现在坚持静力学,你能否评论我的做法3。我从地图中移除静态对象,不应该再出现。而且我确实考虑过你提到关于android释放内存的情况。我处理该问题,并简单地关闭我的活动,用户可以再次请求数据。谢谢。 – achie

+1

顺便说一句,这个解决方案有一个catch ..你不仅要扩展活动,你还必须扩展你使用的其他基本活动,如“ListActivity”,“PreferenceActivity”等,并有这个逻辑复制在那里... – havexz

+0

@ havexz没有赶上。无论你是子类Activity还是Activity的其他子类,这都会起作用。这里的想法是,你不会在所有活动中共享设置/获取代码,因为每个活动传递的内容可能有所不同,因此共享不会对你有多大好处。我想你正在考虑一些其他问题。 Acitivity.getApplication()方法可用于Activity的所有子类。 – chubbsondubs