【问题标题】:Class extending Application in Android project library?Android项目库中的类扩展应用程序?
【发布时间】:2011-12-27 22:18:57
【问题描述】:

我有一个项目(在 Eclipse 中),我已将其转换为 Android 项目库,以便在另一个类似项目中重用一些代码。我想我已经在脚上开枪了,但是因为我收到了错误:

Unable to start activity ComponentInfo{com.test.scroller1/com.lib.scrolltest.ScrollTestActivity}: java.lang.ClassCastException: android.app.Application cannot be cast to com.lib.scrolltest.resAppVars

com.lib.scrolltest 是我的项目库,它实例化了一个类扩展应用程序 (resAppVars)。在我调用的 onCreate() 方法中:

mRav = (resAppVars) getApplicationContext ();

这样,我可以使用 mRav 对象中的方法,否则这些方法会成为其他类中的大量重复代码(例如将查询传递给返回结果 ArrayList 的通用 select 语句)。

这里有什么问题?看来我在实现 Application 类的方式上遇到了限制。

【问题讨论】:

    标签: android


    【解决方案1】:

    调用 getApplicationContext() 会返回当前应用程序的 Application 对象(即拥有 onCreate() 正在其中运行的活动的应用程序)。

    除非您在做一些奇怪的事情,否则您无法选择使用哪个 Application 类。 Application 的文档中甚至有一条注释说不要这样做:

    通常不需要子类化应用程序。在大多数情况下, 静态单例可以以更模块化的方式提供相同的功能 大大地。如果您的单例需要全局上下文(例如注册 广播接收器),检索它的函数可以给出 上下文在内部使用 Context.getApplicationContext() 时 首先构造单例。

    你应该在你的库项目中创建一个常规的共享类。或者,如果您不需要库项目提供的特殊功能,您也可以使用常规的 .jar 文件。

    如果您需要共享状态,只需将其设为单例即可。 ;)

    【讨论】:

    • 谢谢,但静态变量(单例)不是 Android 中的最佳方式。在应用程序生命周期的某些实例中,静态变量可以初始化为默认值。 stackoverflow.com/questions/2475978/… electronicvendor.com/using-static-variables-in-android 不过,我很感谢你抽出时间来回答。
    • 据我所知,单例将在您的应用程序进程的整个生命周期中存在。该进程的生命周期至少与应用中任何未销毁的组件(活动、服务等)一样长。
    • @wufoo 我还是不明白为什么静态单例不好。我的意思是,Android 文档本身说要使用它们而不是继承 Application 类。怎么会这么差??
    • 事实证明,静态变量(单例)存在一些分歧。有人说好,有人说不好。正如 Igor 提到的,Android 文档确实推荐使用静态。对于那些刚接触 Android 开发的人,请注意静态变量通常不受欢迎,因为它们可以在应用程序内的任何地方和任何地方进行修改。这是一个完全打破模块化编程设计的概念,并且几乎总是最终成为维护难题。
    • 我尽量避免使用静态对象,以java背景思考会让你相信这些静态对象会在应用程序生命周期中永远存在;但是,当在 Android 应用程序中使用时,只要应用程序处于后台并且设备出现内存不足警告,SO 就可以删除您的静态对象。问题是它可以释放静态类,但有时它会将最后一个活动留在内存中;当用户打开应用程序时,最后一个活动会运行,但静态对象不再存在,因此很有可能发生崩溃。所以要小心并尽量在你的单例代码中防止这种情况发生。
    【解决方案2】:

    虽然这是一个非常古老的帖子。我遇到了同样的问题并解决了。所以我想我会为大家发布解决方案。

    原来我忘记在清单文件中声明子类应用程序名称。 android:name 应该指向扩展的应用程序类,即使它是在引用的库中定义的。

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:name="com.example.lib.MyApp">
    

    添加后,我可以在项目中的任何位置使用带有(&lt;cast&gt;) getApplication() 的扩展应用程序。

    【讨论】:

      猜你喜欢
      • 2017-06-20
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 2012-04-14
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      相关资源
      最近更新 更多