2013-03-27 3 views
6

Android 앱을 개발하는 과정에서 정적 클래스에 넣은 유틸리티 유형 메서드 모음이 생겼습니다. 이 모든 메소드는 여러 활동에서 사용되며 대다수의 메소드는 호출 활동의 정보를 필요로하지 않습니다.컨텍스트/활동이있는 정적 유틸리티 클래스 - Android

그러나 이제 활동의 컨텍스트가 필요한 몇 가지 방법과 활동 자체가 필요한 방법이 있습니다. 내가 그들 중 일부 예시 보자.

  • getDeviceNaturalOrientation() - 사용을 액티비티의 하여 GetWindow() getWindowManager() getDefaultDisplay() 장치의 자연의 방향을 결정하기 위해 디스플레이 회전, 폭, 높이를 액세스 할 수 있습니다. .
  • getDeviceOrientation() - 위의 유사하지만 현재 방향을
  • 를 CreateFile()을 얻으려면 - 일부 리소스 (문자열)에 액세스하기 위해 컨텍스트를 사용하고 로 만들고 약간의 토스트를 보여

자,이 경우 Utils 클래스에 대한 내 큰 질문은 다음과 같습니다

  • 지금까지, 각 기능은 내가에있어 어떤 활동에서 통과 컨텍스트 매개 변수를 사용하지만 정적 컨텍스트 또는 활동 변수를 만들려면 확인 될
      Uti에서 클래스를 만들고 onCreate와 같이 각 액티비티의 시작 부분에 설정합니까? 이 변수는 Context 또는 Activity 인스턴스가 필요한 함수에서 사용됩니다.
    1. 위의 내용을 권장하지 않는다고 가정 할 때 Activity 매개 변수를 메서드에 전달하는 것이 좋습니까? 아니면 Activity를 Context로 전달할만한 이유가 있습니까? 위의 장치 방향 지정 함수에 사용하는 메서드는 컨텍스트가 아닌 Activity 개체에만 해당되므로 Activity 나 Context로 전달하여 Activity로 캐스팅합니다 (후자는 끔찍한 생각처럼 들립니다).

    또한이 Util 클래스가 컨텍스트/활동이 필요한 이러한 메서드를 사용하는 방법이 아닐 수 있으므로 아이디어를 매우 유용하게 사용할 수 있습니다. 따라서 이러한 메서드의 복사본이있는 것을 방지 할 수있는 대안을 환영합니다. 그것들을 사용하는 각각의 활동 클래스.

  • 답변

    3

    1) 컨텍스트에 대한 정적 링크는 메모리 누수의 원인이 될 수 있습니다. 이것은 액티비티에 대한 참조가 파괴 된 후에도 정적 변수에 보관되므로 작업 및 모든 뷰의 메모리는 유효하고 gc로는 지워지지 않습니다. 이 작업을 수행 할 수는 있지만 완료되면 변수를 null로 조심해야합니다. 그냥 피하는 것이 더 좋습니다.

    2) 액티비티로 액티비티를 전달하기가 다소 어색하지만 기술적 인 이유는 없습니다. 이 시점에서 우리는 코드의 청결성/유지 보수성에 대해 논쟁하고 있습니다. 그리고 비 청결 솔루션이 더 쉬울 때가 있습니다. 물론 위의 경우에는 전체 컨텍스트를 전달하거나 특수 접근자를 만드는 것보다 orientation/display/Resources 객체를 함수에 전달하고 싶습니다.

    +0

    고맙습니다. 답변을 수락했습니다. 나는 대부분 그대로 유지하면서 끝났지 만, 전체 컨텍스트 대신 필요에 따라 Resources/FragmentManager/etc ... 만 수신하는 메소드를 변경했습니다. 그것은 매개 변수의 숫자에 추가하지만, 나는 일이 잘못 될 수 있다고 생각합니다. 다시 한번 감사합니다. – RobertoCuba

    0

    난 당신이 활동

    MyUtility utility=new MyUtility(); 
    utility.getDeviceNaturalOrientation(this); 
    utility.getFile(this); 
    

    에서 호출 그리고 당신은

    public int getDeviceNaturalOrientation(Activity activity){ 
    //code 
    return some_oreientation 
    } 
    

    처럼이 함수를 정의 할 때 다음과 같은 설계는 잘해야한다고 생각이

    public File getFile(Context context){ 
    //code 
    //return file handler 
    } 
    

    활동 같은 것입니다 Context의 하위 클래스이므로 디자인을 다음과 같이 변경할 수도 있습니다

    MyUtility utility=new MyUtility(this); //this refer to Activity 
    utility.getDeviceNaturalOrientation(); 
    utility.getFile(); 
    

    는 당신이 활동을 통과 당신은 잘하지만 당신은 당신의 활동에서 다음과 같은 경우 먼저 메소드 호출

    MyUtility utility=new MyUtility(getApplicationContext()); 
    utility.getDeviceNaturalOrientation(); //will throw exception 
    utility.getFile(); 
    

    에서 오류가 발생합니다 그리고, 네 첫번째 생각은 권장되는 방법이 아닙니다.

    +0

    응답 해 주셔서 감사합니다. 그러나이 유틸리티 클래스가 정적이 아니며 인스턴스화 된 것은 아닙니다. 그 외에, 당신이 묘사 한 것은 제가 이미 해왔 던 것입니다. 당신의 마지막 요점은 또 다른 생각을 불러 일으켰습니다. 절반이 온라인으로 볼 수있는 예제는 Activity와 getApplicationContext()를 교환 할 수있는 것으로 취급합니다. 지금까지 내 애플 리케이션에서 나는 결코 후자를 사용하지 않았고 모든 것이 괜찮다. 심지어 샘플에서 나는 getApplicationContext()를 사용하는 위치에서 벗어난다. Application 클래스를 만들 때만 그런 것이 아닙니까? – RobertoCuba

    +0

    응용 프로그램 수명주기 및 활동 수명주기가있는 활동 컨텍스트로 응용 프로그램 컨텍스트를 연결합니다. 따라서 응용 프로그램 컨텍스트가있는 대화 상자를 만들지 않으려 고하고 Activity Context로 대화 상자를 작성한다고 가정합니다. – minhaz

    0

    난 당신이 보내는 것이 좋습니다 것 WeakReference of your Activity 또는 getApplicationContext() 및 메모리 누수 static method 원인 을하기 때문에 사용하지 않는 (그것을 사용하여 작업 할 수있는 그 작품). Read Developer blog

    관련 문제