静态方法与扩展 android.app.Application 的类?

Posted

技术标签:

【中文标题】静态方法与扩展 android.app.Application 的类?【英文标题】:Static methods vs. class extending android.app.Application? 【发布时间】:2012-01-29 06:57:54 【问题描述】:

我有一个类在 android tabHost 应用程序中扩展应用程序。在 App 类中,我一直在放置方法和变量,否则我需要在每个类中重新创建它们。一种方法从数据库中读取并将结果存储在 ArrayList 中(例如名字,姓氏)。我没有重新读取该数据库并为每个需要该信息的选项卡视图重新创建代码,而是将方法和 ArrayList 固定在扩展 Application (myAppClass) 的类中。这样,通过在 onCreate() 的任何选项卡视图中设置 mAC = (myAppClass) getApplicationContext(),我可以引用 myAppClass 中的所有 get..() 和 set..() 方法。

我最初的计划是使用带有静态方法和变量的共享类,但我读了很多“不要那样做”的帖子,所以决定走应用程序路线。现在,我遇到了一种情况,我试图在项目库中使用 myAppClass 但收到有关 android.app.Application cannot be cast to... 的错误如果我将 myAppClass 改回静态方法/变量(并且不扩展应用程序),那么一切正常,但这应该是一个很大的禁忌。还有另一种方法可以做到这一点吗?不确定Android是否通过引用传递所有内容,但我最好通过在方法/类之间来回传递巨大的(数千个对象/成员)ArrayLists来重新实现整个应用程序吗?

【问题讨论】:

只有一个Application实例。无需使用 getter 和 setter。只需在您的子类应用程序中使用静态方法/变量并以这种方式使用它们:MyApplication.myMethod() ... 【参考方案1】:

我最初的计划是使用带有静态方法和变量的共享类,但我读了很多“不要那样做”的帖子,所以决定走应用程序路线。

“不要那样做”通常是针对全局范围内的任何内容的建议,因此将涵盖静态数据成员以及自定义 Application。两者都可能是内存泄漏的来源。

现在,我遇到了一种情况,我尝试在项目库中使用 myAppClass,但收到有关 android.app.Application 的错误无法转换为...

您在托管项目中的清单可能未声明使用库的 Application 实现。

这应该是一个很大的禁忌

同样,静态数据成员并不比自定义 Application 差,而且在许多情况下更好。

还有其他方法吗?

不要使用Application 或静态数据成员。

通过在方法/类之间来回传递巨大的(数千个对象/成员)ArrayLists 来重新实现整个应用程序会更好吗?

最好有一个持久的数据模型,比如数据库。使用静态数据成员作为持久数据模型的缓存是可以的,只要你非常小心你的内存管理。

【讨论】:

感谢您的回复。你用 AndroidManifest 搞定了。使用静态 ArrayList 对象管理内存需要做哪些不同的事情?应用程序结束时Android不会清理吗? @wufoo:“Android 不会在应用程序结束时进行清理吗?” -- 虽然内存会在进程最终终止时被清理,但在此之前的内存泄漏仍然会导致您的应用程序因堆空间不足而崩溃。 谢谢。 Eclipse 内存分析器是查找泄漏的好工具吗?在这里关闭一个 2 年的旧线程:***.com/questions/1147172/… @wufoo:“Eclipse 内存分析器是查找泄漏的好工具吗?” - 它是查找泄漏的绝佳工具。 android-developers.blogspot.com/2011/03/…

以上是关于静态方法与扩展 android.app.Application 的类?的主要内容,如果未能解决你的问题,请参考以下文章

静态方法与扩展 android.app.Application 的类?

Python基础-封装与扩展静态方法和类方法

ecshop二次开发系统缓存优化之扩展数据缓存的必要性与方法

用静态类扩展类的方法

C#之项目常用方法之静态扩展

C# 扩展方法