13

アプリケーションのどこかで、エラー メッセージの getString メソッドを使用してローカライズされた文字列を取得する必要があります。このためには、Activity などから取得した Context インスタンスが必要です。これは本当にこれが設計されている方法ですか?これらのオブジェクトをクラスやメソッドに渡すことを本当に強制されているのでしょうか、それともポイントを逃していますか?文字列参照を取得する他の方法はありますか?

明確にするために、Activity には内部 AsyncTask サブクラスがあり、doInBackground で UI スレッド外の短いネットワーク処理のために新しいクラスをインスタンス化します。エラー メッセージをローカライズしたいので、Context インスタンス (つまり、Activity) をそのクラスに渡す必要があります。XML ファイルから価値のあるリソースを取得する設計は、少し直感的ではないように思えます。Context がグローバル アプリケーション コンテキストであり、Activity のような単なる一部ではないことを意味するため、なぜこれが Context インスタンスと結合され、静的なものや - 許して - シングルトンではないのか、疑問に思います。

4

2 に答える 2

7

いいえ、これを行うべきではありません。簡単なルールは次のとおりです。コンテキストが必要なのがUIに触れることである場合、またはアクティビティクラスの内部にのみ関連付けられている場合は、アクティビティコンテキストを使用する必要があります。それでも、コンテキストへの参照には、アクティビティの存続期間よりも長い存続期間がないことが重要です。

これに従わないことの大きな危険は、アクティビティコンテキストへの参照をコードのより深い場所に渡し、保持している参照がまだスコープ内にある間にアクティビティが破棄されることです。あなたはあなたの活動とそれが参照しているすべてのものを漏らしました。本当に不可欠な場合を除いて、アクティビティのコンテキストをアクティビティの外に渡さないことをお勧めします。その場合でも、そのライフタイムを確実に制御してください。

したがって、文字列リソースを取得してからアプリケーションコンテキストを使用する必要があるなど、UIに関連しないものにコンテキストが必要です。アクティビティ内で、アクティビティで文字列参照が宣言されている場合、アクティビティコンテキストを使用することは許容され、スコープとライフタイムに関して意識的な決定を行うため、私の意見では好ましいと思います。

そうは言っても、この特定の方法がアクティビティに適しているかどうかを尋ねる必要があります。そうではないかもしれませんが、自問してみてください。

最後に、小さな衒学的なポイント。オブジェクトをどこにも渡しません。参照、実際にはオブジェクトへの参照の値を渡します。Javaのすべては値によって渡されます。

于 2012-11-08T22:00:16.313 に答える
0

アプリケーション クラスはいつでも拡張できます。getInstace() がコンテキストを取得するための静的メソッドをそこに作成します。

于 2012-11-08T22:04:27.127 に答える