View 클래스를 상속받아 새로운 뷰를 만들고 배경색상을 일정시간마다 바꿔주는 예제이다.
소스는 아주 심플하지만, 안드로이드 스튜디오의 버전 때문인지,
Handler() 클래스의 handleMessage(Message msg) 이벤트 프로시저때문에 한참을 고생했다.
그 이유는 조금 있다 설명하기로 하고, 일단 MainActivity와 View를 상속받아 재 정의한 클래스를 먼저 살펴보자.
//
package com.example.au.myapplication; import android.app.Notification; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Handler; import android.view.View; import android.widget.Toast; import android.os.Message; //뷰를 상속받아서 만든 뷰 public class myCustomView extends View { Paint mPt = null; Handler mHandler = null; int mColor; public myCustomView(Context context) // { super(context); mPt = new Paint(); mColor = Color.WHITE; setHandler(); //타이머 역할을 하게될 핸들러를 초기화 하는 함수 } public void setHandler() { //Handler를 생성 하고 배경 색상(mColor) 을 그냥 계속 바꿔주는 익명메소드 등록 mHandler = new Handler(){ public void handleMessage(Message msg){ mColor--; invalidate(); // onDraw 함수 호출 mHandler.sendEmptyMessageDelayed(0, 10); //10ms마다 handleMessage(Message msg) 반복 호출, 즉 10ms 마다 다시 배경색을 } }; boolean bSend = mHandler.sendEmptyMessage(0); //Toast.makeText(getContext(), Boolean.toString(bSend), Toast.LENGTH_SHORT).show(); } public void onDraw(Canvas canvas) { canvas.drawColor(mColor); //배경 색상(mColor) 을 그림 } }
//
이제 메인 액티비티에 내가 직접 만든 뷰를 콘텐트뷰로 등록 하고,
앱을 종료할 수 있는 onBackPressed 함수를 오버라이드 해준다.
//
package com.example.au.myapplication; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; import static java.security.AccessController.getContext; public class MainActivity extends AppCompatActivity { myCustomView mCV = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); mCV = new myCustomView(this); //내가 만든 뷰를 콘텐트뷰로 등록 setContentView(mCV); } @Override public void onBackPressed() { mCV.mHandler.removeMessages(0); //Handler 종료 Toast.makeText(getApplicationContext(), "종료", Toast.LENGTH_SHORT).show(); moveTaskToBack(true); finish(); android.os.Process.killProcess(android.os.Process.myPid()); } }
//
결과물은 뭐 별게 없다. 단순히 아무것도 없고, 앱 배경 색상만 10ms 로 바뀐다.
![[안드로이드 개발 요약 - 3] Handler 를 이용한 타이머 동작 (반복수행) - undefined - 모든 영역 안드로이드 타이머 사용 방법](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
Handler() 클래스의 handleMessage(Message msg) 이벤트 프로시저때문에 한참을 고생했던 이유는
다름아닌 안드로이드 스튜디오에서 자동으로 임포트 해야하는 패키지를 추천해 주는데
잘못된 패키지를 추천해 주어서 handleMessage가 동작하지 않는 문제였다.
![[안드로이드 개발 요약 - 3] Handler 를 이용한 타이머 동작 (반복수행) - undefined - 모든 영역 [안드로이드 개발 요약 - 3] Handler 를 이용한 타이머 동작 (반복수행)](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
handleMessage의 파라미터인 Message 클래스를 MessageStyle의 것으로 계속 추천을 해주는 터라
안드로이드 프로그래밍을 처음해보는 나에겐 뭐가 맞는지를 모르기 때문이였다.
Message가 속해 있는 패키지는 import android.os.Message; 이다.
댓글