2

在我的应用程序的每个活动中,所有视图(网格/列表/按钮......很多)都被声明为活动的静态成员。这是好的做法还是有更好的方法。一直想弄清楚这个一个月,最后决定问。任何帮助表示赞赏!

4

4 回答 4

3

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。查看标题下的详细信息 *如何在单个应用程序中的活动/服务之间传递数据?。

于 2013-03-25T11:54:39.097 回答
2

这两个链接可以回答您的问题:

还有应用程序性能的详细信息。

于 2013-03-25T11:52:41.407 回答
1

我个人会避免使用静态变量,因为这些变量保存在内存中,即使活动可能不再需要它们。

UI 组件实际上不需要是静态的,因为它们应该使用 findViewById 从 onCreate 中检索,或者在 onCreate 中以编程方式创建,并且不需要永久存储变量。

于 2013-03-25T11:51:19.320 回答
1

您不应将 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会实例化一个实例。因此,在应用程序级别,使用变量和不使用变量之间没有显着差异,尽管内部静态变量必须以不同方式处理。MyActivityAndroidManifest.xmlstatic

但是,理论上,您可以MyActivity自己在代码中多次实例化。例如,出于某些原因或仅出于测试目的,您可能会在某处写入MyActivity testActivity = new MyActivity();。在这种情况下,您可能无法使用该static myFirstSwitch变量。

于 2016-05-06T17:59:52.000 回答