이벤트 (Event)


이벤트를 받아서 처리하는 각각의 방법들에 대해서 다룬다.

1. 콜백 메서드 재정의

가장 쉬운 방법으로 상속을 받아서 해당 callback함수를 재정의해서 사용하는 방식이다.

단점

  • 메서드 재정의하기 위해 반드시 슈퍼 클래스를 상속받아야 한다. MyButton등을 매번 만들어야 하는 번거로움이 있다.
  • 모든 이벤트에 대해서 콜백 메서드가 존재하는 것은 아니다.

Code

//* 1.핸들러 메소드 재정의 - 상속을 받아야만 재정의 가능하다.
public class HandleEvent extends Activity {
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		View vw = new MyView(this);
		setContentView(vw);
	}

	class MyView extends View {
		public MyView(Context context) {
			super(context);
		}

		public boolean onTouchEvent(MotionEvent event) {
			super.onTouchEvent(event);
			if (event.getAction() == MotionEvent.ACTION_DOWN) {
				Toast.makeText(HandleEvent.this,"Touch Event Received",
						Toast.LENGTH_SHORT).show();
				return true;
			}
			return false;
		}
	}
}

2. 리스너 인터페이스 구현

3. 액티비티가 리스너 구현

4. 뷰가 리스너 구현

5. 익명 내부 클래스 사용

2번 째 방법에서 파생된 기법으로 리스너 하나를 위해 클래스를 일일이 선언하기 번거롭다는 점을 해결한 것이다.
TouchListenerClass onTouch 메서드 구현을 위한 것이며 오로지 TouchListener객체 하나만을 위해 선언한 것이다.
더 이상의 메서드를 추가할 필요도 없고 객체를 두 개 이상 만들 필요도 없다.

객체 지향 언어이다 보니 메서드가 홀로 존재할 수 없으며 클래스 안에 넣어야 하고 객체를 생성한 후 등록하는 번거러운 과정을 거쳐야 한다.
자바는 이런 경우를 위해 언어 차원에서 익명 내부 클래스라는 문법을 제공 한다.
상위 클래스나 인터페이스의 메서드 하나를 재정의하기 위해 클래스를 선언하는 경우, 그리고 그 클래스의 객체가 단하나만 필요한 경우는 굳이 클래스를 선언할 필요 없이 상속과 재정의를 동시에 할 수 있다.

익명 클래스의 구현 예

public class HandleEvent extends Activity {
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		View vw = new View(this);
		vw.setOnTouchListener(TouchListener);
		setContentView(vw);
	}

	View.OnTouchListener TouchListener = new View.OnTouchListener() {
		public boolean onTouch(View v, MotionEvent event) {
			if (event.getAction() == MotionEvent.ACTION_DOWN) {
				Toast.makeText(HandleEvent.this,"Touch Event Received",
						Toast.LENGTH_SHORT).show();
				return true;
			}
			return false;
		}
	};
}

인터페이스의 인스턴스인 것 처럼 보이지만 실제로는 그렇지 않다.
인터페이스 자체는 구현이 없으므로 객체를 생성하지 못하기 때문이다.

익명 내부 클래스를 정의하는 문법을 간략하게 소개하면 다음과 같다.

# 축약된 코드
Interface obj = new Interface(){
	메서드 구현
};

6. 익명 내부 클래스의 임시 객체 사용

public class HandleEvent extends Activity {
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		View vw = new View(this);
		vw.setOnTouchListener(new View.OnTouchListener() {
			public boolean onTouch(View v, MotionEvent event) {
				if (event.getAction() == MotionEvent.ACTION_DOWN) {
					Toast.makeText(HandleEvent.this,"Touch Event Received",
							Toast.LENGTH_SHORT).show();
					return true;
				}
				return false;
			}
		});
		setContentView(vw);
	}
}

5번과의 개념적 차이는 아래와 같다.

# 이름 있는 객체 사용
Class obj = new Class();
Method(obj);

# 임시 객체 사용
Method (new Class());

임시 객체를 사용하면 클래스 선언, 객체 생성문이 필요 없으므로 액티비티가 생성될 때인 onCreate에서 이벤트 등록 및 구현이 모두 가능하여 코드가 아주 짧아진다.

7. Java8에서의 Lambda를 이용한 방법

https://mayojava.github.io/android/java/using-java8-lambda-expressions-in-android/


'Computer Science > Android Application' 카테고리의 다른 글

Activity  (0) 2017.08.16
쓰레드 (Thread)  (0) 2017.08.04
Gradle  (0) 2016.06.03
Android Plot Libraries  (0) 2016.01.22
Android wear app  (0) 2015.08.25

+ Recent posts