2010-11-30 2 views
3

메소드를 작성하거나 멤버 변수를 사용할 때 종종 앱에서 공유 할 필요가 있습니다. 그러나 그들은 어디로 가야합니까?Android 앱에 전역 메소드와 변수를 어디에 배치해야합니까?

Activity를 서브 클래스화할 수 있지만 MapView를 사용하자 마자 넘어져서 MapActivity를 사용해야하므로 모든 액티비티가 내 서브 클래스에서 상속받지 않습니다. 이 주변에 나는 방법이 있습니까?

상속을 적용 할 수없는 경우 일반 메서드와 멤버 변수를 Application 개체의 하위 클래스에 넣으려고합니다.하지만 모든 클래스가 해당 클래스에 대한 액세스 권한을 얻으려고 할 때마다 코드 혼잡이 발생하는 것으로 알고 있습니다. 컨텍스트를 통해 응용 프로그램 개체를 통과 시키거나 전달해야합니다.

나는 응용 프로그램 개체를 응용 프로그램 클래스를 통해 전달하는 대신 MyApplication.getInstance()를 생성하고 모든 것을 단일 개체로 유지하는 것이 더 나을 것이라고 생각합니다. 하지만 전에 네가해야 할 말을보고 싶었어.

답변

5

액티비티 외부에서 "Global Singleton"에 액세스하려는 경우 관련 개체 전체를 통해 Context을 전달하지 않으려는 경우에는 설명 된대로 정적 특성을 정의 할 수 있습니다 응용 프로그램 클래스에서 자체에 대한 참조를 보유합니다. onCreate() 메소드에서 속성을 초기화하기 만하면됩니다. 자원

public class ApplicationController extends Application { 
    private static ApplicationController _appCtrl; 

    public static ApplicationController getAppCtrl() 
    { 
     return _appCtrl; 
    } 
} 

한 예 : 예를 들어

: Application의 서브 클래스는 또한 자원을 얻을 수 있기 때문에 당신이 좋아하는 그들을 반환하는 정적 메소드를 정의 할 때, 당신은 단순히 그들에 액세스 할 수 있습니다
public static Resources getAppResources() 
{ 
    return _appCtrl.getResources(); 
} 
2

전역 방법의 경우 정적 메서드가있는 Util 정적 클래스를 사용하십시오. 정적 메소드를 사용할 수 없다면, 메소드는 처음에는 전역 적이 지 않아야하며, 의미가있는 클래스에 넣어야합니다.

+0

@ user23 :이 질문은 2 세 이상입니다. 질문이 있으면 새로운 질문을하십시오. – Falmarri

0

먼저이 글을 읽을 :

How to declare global variables in Android?

이제 정적 싱글 톤을 사용하지 않아야합니다. 싱글 톤을 사용하는 것은 전역 변수와 동일합니다. 전역 변수는 전역 변수를 사용하는 모든 곳에서 모듈성을 깨거나 전체적인 디자인에 대한 전체적인 세부 사항 및 가정을 소개하기 때문에 유지 관리 가능성을 감소시킵니다. 프로그램은 한 곳에서 찾기 때문에이 두 변수를 가질 수 없습니다. 이것은 하나가 아닌 두 개의 인스턴스가있을 때 프로그램이 쉽게 적응할 수 없음을 의미합니다. 예를 들어

, 나는 playTurn()라는 메서드가 있다고 나는 그렇게처럼 구현 :

public void playTurn() { 
    globalPlayer.incrementClock(); 
    globalPlayer.doSomething(); 
    globalPlayer.doSomethingElse(); 
} 

지금의 내가 믹스에 두 번째 플레이어를 추가 할 가정 해 봅시다. 어, 내 playTurn() 메서드는 globalPlayer를 사용할 때만 한 명의 플레이어 만 사용합니다. 두 번째 플레이어를 프로그램에 추가하려면 해당 메서드를 변경해야합니다. 이 작업을 많이 수행하면 프로그램이 매우 엄격하고 변경하기가 쉽지 않습니다. 내가 이런 짓을하는 대신 어떤 경우 :

public void playTurn(Player player) { 
    player.incrementClock(); 
    player.doSomething(); 
    player.doSomethingElse(); 
} 

지금이 작업을 수행 할 수 있습니다

playTurn(player1); 
playTurn(player2); 

둘 다 재생기 및 player2에 대한 playTurn()를 다시 사용할 수 있습니다 나는 그것을 변경할 필요가 없었습니다.방금 그 방법의 클라이언트를 변경해야했습니다.

대부분의 경우 게으르다가 일부 객체에 대한 참조를 얻고 자 할 때가 많으며, 전역 변수는 잘 알려진 객체에 대한 참조를 얻기위한 빠른 방법입니다. 대신 시작시 또는 그것이 의미있는 시간에 응용 프로그램의 종속성을 해결하는 하나의 클래스를 갖는 것이 더 좋습니다. 그런 다음 한 곳에서만 코드가 어떻게 결합되는지 이해합니다. 예 :

public class Game { 
    Player player1; 
    Player player2; 
    Board board; 

    public void startGame() { 
     BlueTooth blueTooth = BlueTooth.getChannel(); 

     player1 = new LocalPlayer(); 
     player2 = new NetworkedPlayer(blueTooth); 

     board = new Board(); 

     player1.setOpponent(player2); 
     player1.setBoard(board); 
     player2.setOpponent(player1); 
     player2.setBoard(board); 
    } 
} 

이제 모든 사람이 자신의 종속성을 가지며 정적 변수를 사용하여 참조를 찾을 필요가 없습니다. 또한 player1은 네트워크를 통해 player2와 같은 세부 정보를 알 필요가 없으며 게임이 별개입니다. 주목해야 할 중요한 점은 우리가 연결하고있는 이러한 객체는 수명이 길며 프로그램 전체가 가능할 수도 있지만 런타임에 다른 것들을 만들어야하는 경우에도 괜찮습니다.

예를 들어 게임에 참여한 사람을 기반으로 런타임에 여러 플레이어를 만들어야합니다. 우리는 시작시 인스턴스화 할 수있는 PlayerManager를 생성 한 다음 즉시 Player 객체를 만들 수 있습니다. PlayerManager는 새로운 게임을 시작할 때 게임에서 만드는 단순한 오래된 객체입니다.

나는 이것이 소프트웨어를 개발하는 훨씬 더 좋은 방법임을 알기를 바랍니다. 당신은 그것을 바로 이해할 수 없을지 모르지만, 당신이 그것에 대해 생각한다면 그것은 더 이해 될 것입니다. 그것은 매우 미묘한 변화이지만 매우 강력합니다.

+0

당신이 답변을하고 그 추론을 해 주셔서 감사합니다.하지만 안드로이드 플랫폼 환경에서 활동이 생성되고 필요에 따라 파괴되는 것을 이해합니다. 데이터를 저장할 수 없습니다. 따라서 액티비티 전반에서 액세스 할 수있는 인스턴스가 있어야합니다. 이러한 이유로 Singleton이 이러한 종류의 질문에 대해 첫 번째로 제안됩니다. Singleton없이 인스턴스를 공유하는 문제를 해결하기 위해 어떻게 솔루션을 변경할 수 있는지 보여 줄 수 있습니까? –

+0

예. 자주 논의되지 않는 것은 활동이 파괴되고 자주 생성되지만 Application 인스턴스는 그렇지 않다는 것입니다. 앱의 매니페스트에서 생성되는 애플리케이션 클래스를 제어 할 수 있습니다. 따라서 Application 클래스를 하위 클래스로 만들면 응용 프로그램의 매니페스트에 정규화 된 클래스 이름을 넣을 수 있으며 Activity는 Application 인스턴스에 액세스 할 수 있습니다. 거기에서 응용 프로그램의 기본 캠프를 설정하고 활동, 서비스 등에서 액세스 할 수 있습니다. – chubbsondubs

+0

매우 감사하고 재미있는 답변을 주셨습니다. :) –

관련 문제