是否可以使用静态属性在应用程序周围移动数据?

时间:2014-05-21 18:37:25

标签: java android variables properties static

我需要在应用程序的不同活动中访问我的一些自定义对象。为此目的,为了便于访问,我一直使用静态属性将数据从活动移动到另一个活动 例如,我有以下类:

public class TrackItem {
    public String title, imageUrl, mediaUrl, type, artist, desc;
    public static TrackItem track;
}

开始活动:

TrackItem.track = items.get(i); // 'items' is an arraylist defined elsewhere
Intent trackActivity = new Intent(c, TrackActivity.class);
startActivity(trackActivity);

现在在TrackActivity内我可以轻松访问TrackItem.track并使用它的属性 我只是需要知道我是否犯了错误?有没有更好的方法呢?

3 个答案:

答案 0 :(得分:3)

解决这个问题的android方法就是让你的班级

Parcelable

并将意图从一个活动传递给另一个活动。

如果您正在初始化活动中的静态变量,请注意丢失数据,因为在android活动可以在其状态更改为暂停后的任何时刻被销毁。此外,如果整个应用程序被系统杀死,则可以擦除静态变量,这种情况经常发生。然后你就会得到

NullPointerException

尝试访问您的数据。

如果你真的想在

中使用静态成员处理它们的初始化
Application

类构造函数,因此它们将在应用程序启动时重新创建,被杀死。

但总的来说,这不是Android的好习惯。

答案 1 :(得分:1)

我想说在某些情况下可以,但可能还有其他更合适的解决方案。

您可以拥有一个使用单例原则的中央数据存储类,因此可以从任何地方访问。您可以将商品ID添加到新Intent的{​​{1}}。然后,使用id,您可以从数据存储中获取该项目。

您还可以将项目序列化,然后将其添加到Activity

使用静态成员时要记住的一件事是它可能导致内存泄漏。静态成员与类相关,因此如果您将它们设置为null,或者整个应用程序被终止并且类加载器卸载此特定类,则只会进行垃圾回收。

答案 2 :(得分:1)

一般来说,这是一种不安全的做法,因为很难跟踪谁在操纵其数据。将静态变量用于簿记信息更加安全,例如可以用来查找相应TrackItem的ID(例如在SQLite数据库中),这是它自己的对象,并且没有其他编辑的机会它什么时候不应该。它是OOP的术语,使用静态变量作为共享数据中断封装。

如果您希望在应用程序周围发送数据,那么使用意图或其他人所说的或使用SharedPreferences这样做会好得多。两者都具有以下优点:您在任何给定时间只处理对象的一个​​实例,SharedPreferences具有在应用程序被杀死后保持数据的附加优势,以便用户可以恢复与播放时相同的轨道他们关闭了应用程序。这两者都比使用静态成员作为共享数据字段更安全。