System.out.println("Hello, World");

타이머 처리를 위해 Handler 클래스를 사용한다. 핸들러는 스레드간의 메시지 통신을 위한 장치로서 sendMessage 메서드나 유사 메서드로 특정 핸들러에게 메시지를 보낼수 있다. 핸들러는 스레드의 경계를 넘어설수 있는 범용적인 통신 장치이며 제대로 사용할려면 꽤 많은 것을 알아야 하지만 한 스레드내에서 간단하게 타이머로도 쓸수 있다.


mHandler가 핸들러이며 handleMessage에서 value값을 1 증가 시켜 텍스트뷰로 호출한다. sendEmptyMessageDelayed 메서드로 1초간의 지연시간을 두어 1초후에 호출되도록 한다.



다음은 핸들러가 하는 일이 복잡하지 않고 코드가 단순하다면 굳이 외부에 둘 필요 없이 onCreate 메서드 안에서 지역적으로 초기화 시키는 것도 가능하다. 이벤트 리스너를 onCreate에서 생성 및 초기화하는 것과 마찬가지이다.



핸들러 초기화문이 onCreate에 작성되어 있으며 최초 빈 메시지를 보내는 문장과 나란히 둘수 있어 좀더 간단해보인다. 

핸들러가 자신을 재귀호출하면 무한히 반복되지만 일정 조건이 만족되면 재호출을 중지 할 수도 있다.


핸들러로도 타이머 흉내를 낼 수 있지만 익숙해지면 오히여 융통성이 있다. 중간에 타이머를 멈추거나 주기를 바꾸는 것도 가능하지만 스레드 간의 통신을 위해 제공되는 클래스라 원래의 용도와는 조금 맞지 않는 면이 있기 때문에 CountDownTimer 클래스를 활용하는 것이다.




위의 소스는 객체를 생성하자마자 시작하며 10초동안 1초 간격으로 나누어 작업한다. 

value가 5가 되면 cancel이 되도록 명령을 했지만 무슨 이유인지 작동안하고 10초까지 카운트한다. 




Posted by 김마농

버튼은 클릭이외에도 롱클릭이라는 이벤트를 받는다. 롱클릭은 버튼을 일정한 시간동안 계속 누르고 있는 동작이며 터치를 떼지 않고 계속 누르고 있으면 롱클릭 이벤트가 발생한다. 

다음은 버튼과 롱클릭 버튼을 2개 모두 활용한 모습이다. 

XML에서 각각 버튼에 mOnClick이라는 OnClick을 주었고, 이 버튼을 찾아서 setonLongListener를 해준다.



Posted by 김마농

보통 버튼에 리스너를 추가하여 작업하지만 소스가 지저분해진다. 

하지만 버튼에 클릭했을때 어떤 동작을 수행할지 추가해주면 소스도 깨끗해지고 간편해진다.




하지만 속성을 통한 핸들러 연결은 클릭 이벤트에 대해서만 예외적으로만 적용되는 것이므로 다른 이벤트에는 사용할 수 없다.

 또 SDK1.6버전에서 추가된 기능이라 다른 버전에서는 실행되지 않을 수 있다.

Posted by 김마농


버튼 2개를 통해 Text뷰를 찾아가서 문자열을 변경한다. 


비슷한 코드가 반복되면 통합하는것이 리팩토링의 기초이다. 다행히 안드로이드는 하나의 리스너를 여러 뷰에 대해 등록하는 것을 허용한다.

한 객체를 두 번 사용하려면 이름이 필수적이므로 익명 클래스의 임시 객체를 생성하는 방법은 쓸 수 없다.



핸들러가 하나로 통합되었다는 면에서는 바람직하지만 액티비티를 리스너로 사용한다는 점은 다소 부담스럽다. 최상위의 액티비티는 그대로 두고 

별도의 리스너 객체를 멤버로 선언한후 이 멤버를 리스너로 사용하는 것이 좀 더 깔끔하다. 






Posted by 김마농


키 액션을 통해 mX, mY의 값에 변화를 주어 원이 이동시키게끔 만들어준다. 



Posted by 김마농


처음 누를때, 누른 상태로 이동할 때, 떨어질 떄 각각 다른 이벤트가 발생한다. 현재 화면좌표는 MotionEvent의 getX, getY메서드로 조사한다. 

곡선을 구성하는 점의 개수는 제한이 없으므로 고정 크기의 배열을 사용해서는 안되며 반드시 가변 크기를 지원하는 컬렉션을 사용해야 한다. 

추가만 되고, 중간에 삽입, 삭제할 일을 없으므로 배열형식의 ArrayList가 적합하다. 

Posted by 김마농