在我的应用程序的每个活动中,所有视图(网格/列表/按钮......很多)都被声明为活动的静态成员。这是好的做法还是有更好的方法。一直想弄清楚这个一个月,最后决定问。任何帮助表示赞赏!
4 回答
http://developer.android.com/training/articles/perf-tips.html。查看文档以了解何时使用静态变量。
我同意Boardy 的评论。为什么你需要你的 ui 元素是静态的。
不推荐使用静态变量。静态变量存储在堆的 PermGen 部分中。即使类完成了它的工作,静态变量也会留在堆中。垃圾收集器会做标记和清扫。如果您在第二个活动中引用的第一个活动中有一个静态变量,则链接将保持很长时间。如果您使用更多静态变量,您可能会出现内存泄漏。也减少使用不必要的物品。
静态变量由 ClassLoader 引用的 Class 对象引用 - 因此,除非 ClassLoader 以某种方式删除 Class 或 ClassLoader 本身符合垃圾收集条件,否则静态变量不会被垃圾收集。因此,如果您使用在许多类中引用的静态变量,除非这些类可用于垃圾收集,否则这些类和声明静态变量的类不能被垃圾收集。所以这会导致堆内存扩展导致内存泄漏。
在这个视频中,这个人谈到了为什么不应该使用静态变量以及如何避免内存泄漏。http://www.youtube.com/watch?v=_CruQY55HOk。这家伙谈到使用 MAT Analyzer 来检查内存泄漏。
也看看这个链接。http://developer.android.com/guide/faq/framework.html。查看标题下的详细信息 *如何在单个应用程序中的活动/服务之间传递数据?。
我个人会避免使用静态变量,因为这些变量保存在内存中,即使活动可能不再需要它们。
UI 组件实际上不需要是静态的,因为它们应该使用 findViewById 从 onCreate 中检索,或者在 onCreate 中以编程方式创建,并且不需要永久存储变量。
您不应将 Activity 类中的视图变量限定为static
,因为静态变量是针对该类而不是针对您的 Activity 实例的:
Public MyActivity extends Activity {
private static final string TAG = MyActivity.class.getSimpleName(); // This is a good candidate for `static`.
private static Switch myFirstSwitch; // This is a bad candidate for `static`
private Switch mySecondSwitch; // This is good, and can be accessed by onCreate(), onResume(), etc.
// …
}
如果你目前在使用过程中没有遇到问题,那是因为实际上Android在解析文件的时候myFirstSwitch
会实例化一个实例。因此,在应用程序级别,使用变量和不使用变量之间没有显着差异,尽管内部静态变量必须以不同方式处理。MyActivity
AndroidManifest.xml
static
但是,理论上,您可以MyActivity
自己在代码中多次实例化。例如,出于某些原因或仅出于测试目的,您可能会在某处写入MyActivity testActivity = new MyActivity();
。在这种情况下,您可能无法使用该static
myFirstSwitch
变量。