2011-12-27 5 views
5

私は別の同様のプロジェクトでコードの一部を再利用するためにAndroidプロジェクトライブラリに変わったプロジェクト(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(); 

この方法で、私はそうでない場合は、このような一般的なselect文にクエリを渡すなど、他のクラス(に重複コードの多くになりMRAVオブジェクトのメソッドを使用することができます結果のArrayListを返します)。

ここで問題は何ですか?私はApplicationクラスを実装した方法で限界に遭ったようです。

答えて

4

getApplicationContext()を呼び出すと、現在のアプリケーション(onCreate()が内部で実行されているアクティビティを所有するアプリケーション)のオブジェクトApplicationが返されます。

あなたが何か変なことをしていない限り、あなたはApplicationクラスが使われているものを選ぶことはできません。あなたは自分のライブラリプロジェクトの内部で定期的に共有クラスを作成する必要があります

There is normally no need to subclass Application. In most situation, static singletons can provide the same functionality in a more modular way. If your singleton needs a global context (for example to register broadcast receivers), the function to retrieve it can be given a Context which internally uses Context.getApplicationContext() when first constructing the singleton.

:これをしないと言ってApplicationのドキュメントでも、ノートがあります。また、特別な機能ライブラリプロジェクトが必要ない場合は、通常の.jarファイルを使用することもできます。

共有状態が必要な場合は、それをシングルトンにします。 ;)

+0

Androidでは、静的変数(シングルトン)は最適な方法ではありません。アプリケーションライフサイクルのいくつかのインスタンスでは、静的変数をデフォルト値に初期化できます。 http://stackoverflow.com/questions/2475978/using-static-variables-in-android http://electronicvendor.com/using-static-variables-in-android/私はあなたに答えて時間を割いていただき、ありがとうございます。 – wufoo

+1

私の知る限り、あなたのアプリのプロセスの生涯にわたってシングルトンが存在します。このプロセスは、少なくともアプリケーション内の破壊されていないコンポーネント(アクティビティ、サービスなど)と同じくらい長く存続します。 –

+0

@wufooなぜ私は静的なシングルトンが悪いのか分かりません。つまり、Androidのドキュメント自体は、Applicationクラスをサブクラス化する代わりに、それらを使用すると言います。どうしてそんなに悪いことができますか? –

3

これは非常に古い投稿です。私は同じ問題に遭遇し、それを解決しました。だから誰もが解決策を投稿すると思った。

マニフェストファイルでサブクラス化されたアプリケーション名を宣言するのを忘れたことが判明しました。 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"> 

私は私のプロジェクトで(<cast>) getApplication()どこかで拡張されたアプリを使用することができることを追加した後。

関連する問題