2017-05-24 3 views
0

Here, in this answerActivityインスタンスはWeakReference<Activity>変数に保存されます。したがって、メモリリークのメモリリークを避けるように。それは良い習慣ですか?WeakReferenceのアクティビティインスタンスを保存することをお勧めしますか

public class BackgroundService extends IntentService { 
    private static WeakReference<Activity> mActivityRef; 

    public static void updateActivity(Activity activity) { 
     mActivityRef = new WeakReference<>(activity); 
    } 
} 

私はmActivityRef.get()を使用しており、必要なアクティビティオブジェクトにキャストしています。そのオブジェクトを使用して、アクティビティ内のメソッドにアクセスします。

目的は、サービスからのアクティビティメソッドにアクセスすることで、このコードは、作業を行いますが、私はそれを使用するかどうか混乱しているコメントやない

あたりのように私はまだdocumentない明確に言及しました。

答えて

2

そうすることをお勧めしますか?

目的は、活性が存在しないことサービス

からアクティビティメソッドにアクセスすることです。たとえば、ユーザーがBACKを押して、サービスの実行中にアクティビティを破棄することができます。破壊されたアクティビティでメソッドを呼び出すと、クラッシュする可能性があります。

サービスとアクティビティの間などのコンポーネント間の疎結合通信用のイベントバス(LocalBroadcastManager、greenrobotのEventBusなど)を使用します。アクティビティにはイベントが表示されたときに登録し、必要に応じてサービスにイベントをポストさせます。

+0

私は[LocalBroadcastManager](https://stackoverflow.com/a/25172526/2820534)を実装しました。これはタスクを実行していますが、このブロードキャストを信頼できるのでしょうか?それはいつも対処されるだろうか? – Prabs

+0

@Prabs:「この放送を信用する」とか「いつも対処する」という意味は分かりません。定義上、何らかの事象のために何も登録されていない可能性があります。しかし、その場合、サービスはそれについて知り、他のステップを実行することができます。たとえば、ローカルブロードキャストを送信できます。イベントを受け取るフォアグラウンドUIがない場合、サービスは代わりに「通知」を生成できます。 [このサンプルアプリケーション](https://github.com/commonsguy/cw-omnibus/tree/v8.5/EventBus/LocalBroadcastManager)を参照してください。 – CommonsWare

0

ありませんどこでも、あなたのプロジェクトではなく、あなたがしたい場合は、interfaceはインタフェースを使用して活動を実施し作成して、あなたのサービスにあなたの活動とIntentServiceとの間の通信方法として、そのインターフェイスを通過しActivityの参照を格納するために、そのことをお勧め。

サービスには、アクティビティ(選択)メソッドの参照があります。そのインタフェースを使用してデータにアクセスし、その使用後に参照をクリアします。

関連する問題