我需要在应用程序的不同活动中访问我的一些自定义对象。为此目的,为了便于访问,我一直使用静态属性将数据从活动移动到另一个活动 例如,我有以下类:
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
并使用它的属性
我只是需要知道我是否犯了错误?有没有更好的方法呢?
答案 0 :(得分:3)
解决这个问题的android方法就是让你的班级
Parcelable
并将意图从一个活动传递给另一个活动。
如果您正在初始化活动中的静态变量,请注意丢失数据,因为在android活动可以在其状态更改为暂停后的任何时刻被销毁。此外,如果整个应用程序被系统杀死,则可以擦除静态变量,这种情况经常发生。然后你就会得到
NullPointerException
尝试访问您的数据。
如果你真的想在
中使用静态成员处理它们的初始化Application
类构造函数,因此它们将在应用程序启动时重新创建,被杀死。
但总的来说,这不是Android的好习惯。
答案 1 :(得分:1)
我想说在某些情况下可以,但可能还有其他更合适的解决方案。
您可以拥有一个使用单例原则的中央数据存储类,因此可以从任何地方访问。您可以将商品ID添加到新Intent
的{{1}}。然后,使用id,您可以从数据存储中获取该项目。
您还可以将项目序列化,然后将其添加到Activity
。
使用静态成员时要记住的一件事是它可能导致内存泄漏。静态成员与类相关,因此如果您将它们设置为null,或者整个应用程序被终止并且类加载器卸载此特定类,则只会进行垃圾回收。
答案 2 :(得分:1)
一般来说,这是一种不安全的做法,因为很难跟踪谁在操纵其数据。将静态变量用于簿记信息更加安全,例如可以用来查找相应TrackItem的ID(例如在SQLite数据库中),这是它自己的对象,并且没有其他编辑的机会它什么时候不应该。它是OOP的术语,使用静态变量作为共享数据中断封装。
如果您希望在应用程序周围发送数据,那么使用意图或其他人所说的或使用SharedPreferences这样做会好得多。两者都具有以下优点:您在任何给定时间只处理对象的一个实例,SharedPreferences具有在应用程序被杀死后保持数据的附加优势,以便用户可以恢复与播放时相同的轨道他们关闭了应用程序。这两者都比使用静态成员作为共享数据字段更安全。