2011-11-14 4 views
2

리스너에 리스너를 만들 수 있는지 알고 싶습니다. 예를 들어 버튼에 대한 리스너가있는 경우 해당 리스너에 대한 리스너를 만들어 버튼을 누르면 버튼 리스너의 리스너에 통지됩니다.자바 작업에서 리스너를 수행하는 방법

다른 청취자가있는 경우이 청취자가 함수 호출이 반환 될 때 소멸됩니다. 예를 들어, 주 프로그램에서 청취자에게 청취자가있는 프로그램 시작 부분에서 호출하는 함수를 사용할 수 있습니까?

+2

왜 청취자에게 청취자가 필요합니까? 단추 수신기에 알림이 전송되면 메서드를 호출 할 수 없습니까? – Tudor

+0

나는 보통 사람들이 자신의 적절한 이유가 있다고 가정하기 때문에 "왜 그렇게 좋아 하는가?"라고 물어 보는 사람이 아니지만 ... 왜 그렇게 좋아합니까? 첫 번째 리스너에 필요한 작업을 수행하거나, 여러 개의 리스너를 버튼에 설정하거나 리스너에 "핸들러"목록을 표시하는 것은 어떻습니까? –

+0

기본적으로 프로젝트에 jar 또는 클래스를 추가 한 다음 응용 프로그램 소스 자체의 변경을 최소화하기 위해 처음에 한 번 초기화하는 것입니다 –

답변

2

물론 가능합니다. 청취자 또는 "관찰자 패턴"은 매우 간단합니다. 모든 관찰자 패턴은 실제로 사용 인터페이스를 사용하여 특정 클래스가 특정 메서드를 구현한다는 것을 모든 사람이 알 수 있도록 "계약"을 작성하므로 해당 개체에서 호출 할 수 있다고 확신 할 수 있습니다.

public interface OnClickListener { 
    public void onClick(); 
} 

pubic interface SomeOtherListener { 
    public void onFoo(); 
} 

에 "트리거"이러한 방법을 원하는 코드는, 그 청취자에 대한 참조가 있어야합니다

그래서 예를 들어,이 같은 두 개의 인터페이스를 만들 수 있습니다. 일반적으로이 작업은 "리스너 설정"에 대한 공개 메소드를 공개함으로써 수행됩니다. 그래서 어떤 클래스에서는, 당신은 public void setOnClickListener() { this.onClickListener = listener; }을 가질 것입니다. 리스너를 구현하는 클래스는 이제 setListener (this)를 호출 할 수 있습니다. Java의 인터페이스가 그러한 종류의 다형성을 갖기 때문에 "this"가 여기서 작동한다는 점에 유의하십시오. 클래스를 구현하는 수퍼 클래스 나 인터페이스로 클래스를 캐스트 할 수 있습니다. 예를 들어 "onClick"을 호출하려는 클래스에서 "onClick"을 포함하는 클래스는 "onClickListener"라는 것이 중요합니다. 그게 클래스에 대한 모든 관심입니다. 이제, "onClick"을 구현하는 클래스가 (이전에 등록 된) SomeOtherListener에 대한 참조를 가지고 있다면 onClick은 someOtherListener.onFoo();

을 호출 할 수 있습니다. 디자인) 어떤 기술적 인면에서 당신은 관련 객체/클래스가 그들이 필요로하는 청취자에 대한 참조를 갖도록 당신이 원하는대로 많은 상호 연관된 청취자를 가질 수 있습니다.

죄송합니다. 약간 혼란스러운 경우 죄송합니다. 또한, 정확히 무엇을하고 싶은지에 대한 세부 정보없이 더 자세한 설명을 제공하기가 어렵습니다. 본인이 아는

편집

, 안드로이드 응용 프로그램의 모든 GUI 이벤트를 기록 할 몇 가지 '캐치 올 "을 설정할 수 없습니다.인터페이스 메소드는 반드시 구현되어야하는 빈 메소드로 선언되기 때문에 구현시 원하는 정확한 로깅을 지정해야합니다. 예를 들어 setOnClickListener가 호출 될 때마다 안드로이드 소스를 해킹하여 무언가를 기록 할 수는 있지만, 그렇게 유용하다고 상상할 수는 없습니다. 또한 암시 적으로 이것은 사용 가능한 모든 유형의 리스너에 대해이 작업을 수행해야한다는 것입니다. 사용자가 구현하는 리스너 만 모든 종류의 로깅에 사용할 수 있습니다. 예를 들어, onTouch를 구현하지 않으면 표시 할 로깅이 없습니다 ...

+0

기본적으로 안드로이드 소스의 코드 변경을 최소화하면서 안드로이드 응용 프로그램의 GUI 상호 작용에 대한 모든 이벤트를 기록하려고합니다. 예를 들어 프로젝트에 일종의 jar 또는 클래스를 추가 한 다음 안드로이드 응용 프로그램 내부의 몇 줄의 코드로 초기화하고 GUI와의 모든 이벤트 상호 작용을 기록합니다. 무슨 일을하려고하면 GUI에서 모든 컨트롤을 얻고 동적으로 리스너를 만들 수 있습니다. 인스턴트 메시징 (GUI)에서 생성 된 모든 이벤트를 기록하려고합니다.이 작업을 더 잘 수행하려면 share.Thanks를 수행하십시오. –

2

청취자는 단순히 사건을 전파하는 방법입니다. 통상, 청취자에게 통지하는 객체에는, 청취자의리스트를 보관 유지하는 컬렉션이 있습니다. 이벤트가있을 때 간단히 가서 목록의 모든 리스너에게 알립니다.

수신기의 수신기를 만들 수 있습니다. 그것의 단순히 사슬 맞추기. 따라서 청취자는 통지 할 청취자 목록을 갖게됩니다.

리스너는 일반적으로 함수 호출이 아닌 개체에 있습니다. 따라서 일반적으로 청취자에게 알리는 객체에 리스너를 추가/제거하는 방법을 만들 것입니다.

+0

응답 주셔서 감사합니다. 기본적으로 안드로이드 소스의 코드 변경을 최소화하면서 안드로이드 응용 프로그램의 GUI 상호 작용 이벤트를 모두 기록하려고합니다. 예를 들어 프로젝트에 일종의 jar 또는 클래스를 추가 한 다음 안드로이드 응용 프로그램 내부의 몇 줄의 코드로 초기화하고 GUI와의 모든 이벤트 상호 작용을 기록합니다. 감사! –

+0

좋습니다. 건배 시드 –

1

인터페이스 + 전략 (정책) 및 브리지 디자인 패턴에 대해 읽을 수 있습니다. 일반적으로 Java의 리스너는 단일 인터페이스 대신 많은 인터페이스를 사용하는 차이점이있는 전략처럼 구현되었습니다.

public class MyClass{ 
public List<IListener> _listeners; 
public boolean registerListener(IListener listener){..} 
public boolean removeListener(IListener listener){...} 
public void doSomething(){ 
    if(something){ 
     //foreach listener do listener.doSomthing(); 
    } 
} 
} 

그래서 IListener는이 인터페이스를 구현하고 구현을 MyClass에 등록 할 수 있습니다.

+0

기본적으로 안드로이드 소스의 코드 변경을 최소화하면서 안드로이드 응용 프로그램의 GUI 상호 작용의 모든 이벤트를 기록하려고합니다. 예를 들어 프로젝트에 일종의 jar 또는 클래스를 추가 한 다음 안드로이드 응용 프로그램 내부의 몇 줄의 코드로 초기화하고 GUI와의 모든 이벤트 상호 작용을 기록합니다. 무슨 일을하려고하면 GUI에서 모든 컨트롤을 얻고 동적으로 리스너를 만들 수 있습니다. 인스턴트 메시징 (GUI)에서 생성 된 모든 이벤트를 기록하려고합니다.이 작업을 더 잘 수행하려면 share.Thanks를 수행하십시오. –

관련 문제