7

@RomainGuyによってAvoiding memory leaksの記事を読んだ後、私の現在のAndroidアプリケーションは、アプリケーションの主なアクティビティを過ぎたという間違いに悩まされていることがわかりました。だから私はいつでも、単にその活動パラメータをActivity.getApplicationContext()と置き換えることができます。アプリケーションのアクティビティメソッドを渡すコマンドパターン?

しかし、私のアプリケーションには、アプリケーションのメインアクティビティのメンバーにしかなり得ないメソッドを実行する必要のあるクラスがあります。

したがって、この制限を回避するためにおそらくCommand Patternを使用することを考えていました。 (この時間はObjectデータを装っ)

public class SomeCommandExecuableOnlyByActivity implements Command 
{ 
    public void execute(Object data) 
    { 
     doIt(((MyActivity)data).getWindow()); 
    }  
} 

私が活動を中心にパスを必要とするの行き止まりに再実行しています:

問題は、我々はその一例を見れば、ということです。

この「鶏肉&卵」の状態からどうやって抜けますか?

この問題にアプローチするより良い方法はありますか?

+6

"このアプリケーションの主な活動を周りに回す"ことは間違いだと主張する記事はありません。それを静的なデータメンバー*に入れることは間違いであり、それは記事の一番下にある最初と3番目の箇条書きの中核となる問題です。あなたがそれをなぜ使用しているかを具体的かつ正確に知っているときにのみ、「アプリケーション」を使用してください。これは、特にUI作業のための、 'Activity'のブランケット代替物ではありません。 – CommonsWare

+2

@CommonsWareこの重要な違いを指摘してくれてありがとう。私の場合は、主なアクティビティに静的SharedPreferencesデータメンバを保持して、アプリケーション内のさまざまなモジュールに簡単にアクセスできます。ですから、主なアクティビティをパラメータとして渡すことを避けて、共有されたプリファレンスにアクセスできます: 'MainActivity.staticPrefs'。これは「*静的データメンバー*に入れる」と考えられていますか? – ih8ie8

+1

それは良い質問です。 'SharedPreferences'はインターフェースなので、具体的な実装がどこにあるのか分かりません。わかりません。 'SharedPreferences'が' Context'を保持している場合、 'Application'を使うか、静的データメンバーを避ける必要があります。 'SharedPreferences'で' Application'がうまく動作すると思います。 – CommonsWare

答えて

3

あなたがここで紛失している可能性があるのは、懸念が適切に分離されていると思います。あなたがその上でいくつかの機能を呼び出すためにあなたの主な活動を他の活動に回さなければならないと言うなら、あなたのアプリのアーキテクチャには基本的な設計上の欠陥があります。

ここでコマンドパターンを使用するかどうかはわかりませんが、一般的には共有アクセスを必要とするメソッドを識別し、別のクラスに移動し、そのクラスの別のインスタンスをこの機能を必要とするすべてのアクティビティ、またはインスタンス状態を共有する必要がある場合は、グローバルアプリケーションコンテキストでグローバルインスタンスを作成し、グローバルアクセスパスを提供します(望ましくはありませんが、RoboGuiceのようなDIフレームワークなしで、私の意見では、うまく設計されたAndroidアプリケーションでは、アクティビティにはビジネスロジックがなく、UIの状態を変更する操作しか提供されません。ユーザインタフェースのフローまたは他の計算は、他のクラスに委ねられる。 Model-View-Presenter patternは、あなたのコードを責任をもって構造化しておくために、ここで大いに役立ちます。

あなたが達成しようとしていることについてより多くの洞察を与えることなく、具体的なアドバイスを出すのは難しいです。

関連する問題