2017-05-24 18 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의 참조를 저장하는 자사의 안 좋은 연습 .

이제 서비스에 활동 (선택한) 방법에 대한 참조가 있습니다. 해당 인터페이스를 통해 데이터에 액세스하고 사용 후 참조를 지 웁니다.