7

@RomainGuy가 Avoiding memory leaks 문서를 읽은 후, 현재 사용중인 Android 애플리케이션이 애플리케이션의 주요 활동을 전달하는 실수를 저질렀다는 것을 깨달았습니다. 따라서 언제든지 해당 활동 매개 변수를 Activity.getApplicationContext()으로 간단하게 바꿀 수 있습니까?응용 프로그램의 활동 방법을 전달하는 명령 패턴?

그러나 내 응용 프로그램에는 여전히 응용 프로그램 주 활동의 멤버 일 수있는 메서드를 실행해야하는 특정 클래스가 있습니다.

따라서이 제한 사항을 해결하기 위해 아마도 Command Pattern을 사용하려고 생각했습니다.

문제는 우리가 예를 들어 보면, 그 :

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

나는 활동 주위 패스 (Object 데이터로 위장이 시간을) 필요의 막 다른 골목에 다시 실행하고 있습니다.

"chicken & 달걀"상황에서 어떻게 빠져 나옵니까?

이 문제에 접근하는 더 좋은 방법이 있습니까?

+6

"해당 응용 프로그램의 주요 활동을 전달하는"것은 실수라고 주장하는 기사는 없습니다. 정적 인 데이터 멤버에 넣는 것은 실수 다. 그리고 기사의 맨 아래에있는 첫 번째와 세 번째 글 머리 기호의 핵심 문제이다. IMHO, 당신이 정확히 왜 그것을 사용하고 있는지 정확히 알 때'Application' 만 사용하십시오. 특히 UI 작업의 경우 '활동'에 대한 담요 대체물이 아닙니다. – CommonsWare

+2

@CommonsWare이 중요한 차이점을 지적 해 주셔서 감사합니다. 제 경우에는 응용 프로그램의 다양한 모듈에 쉽게 액세스 할 수 있도록 정적 SharedPreferences 데이터 멤버를 기본 Activity에 유지합니다. 그래서 나는 MainActivity.staticPrefs'라는 매개 변수로 주요 Activity를 넘기는 것을 피함으로써 공유 환경 설정에 접근 할 수 있습니다. 이것은 "* 정적 데이터 멤버에 넣기 *"로 간주됩니까? – ih8ie8

+1

좋은 질문입니다. 'SharedPreferences'는 인터페이스이기 때문에 구체적인 구현이 어디에 있는지 쉽게 알지 못합니다. 모르겠습니다. 'SharedPreferences'가'Context'에 붙어 있다면'Application'을 사용하거나 정적 데이터 멤버를 피할 필요가 있습니다. 나는'SharedPreferences'로'Application'이 잘 작동 할 것으로 기대합니다. – CommonsWare

답변

3

여기에 누락 된 부분은 적절한 분리 문제입니다. 기본 활동을 다른 활동에 전달하여 일부 기능을 호출해야한다고 말하면 앱의 아키텍처에는 근본적인 설계 결함이있는 것 같습니다.

여기에 명령 패턴을 사용할지 여부는 알 수 없지만 일반적으로 할 일은 공유 액세스가 필요한 메소드를 식별하여 별도의 클래스로 이동 한 다음 해당 클래스의 별도 인스턴스를 이 기능을 필요로하는 모든 활동 또는 인스턴스 상태를 공유해야하는 경우 전역 응용 프로그램 컨텍스트에서 전역 상태 경로를 만들고 전역 액세스 경로를 제공합니다 (바람직하지는 않지만 RoboGuice와 같은 DI 프레임 워크가 없으면 Android에서 DI를 구현하기가 매우 어렵습니다.

제 생각에는 제대로 설계된 Android 애플리케이션에서 활동에는 비즈니스 로직이없고 UI 상태를 변경하는 조작 만 제공된다는 것입니다. 사용자 인터페이스 또는 다른 계산의 흐름은 다른 클래스로 남게됩니다. Model-View-Presenter pattern은 코드를 책임있게 구조화하는 데 큰 도움이됩니다.

정확하게 달성하고자하는 것에 대해 더 많은 통찰력을 제공하지 않고도 구체적인 조언을 드리기는 어렵습니다.

관련 문제