IT정보공유/Android

[안드로이드 개발 요약 - 3] Handler 를 이용한 타이머 동작 (반복수행)

알지오™ 2017. 5. 23.

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 로 바뀐다. 

 

안드로이드 타이머 사용 방법
안드로이드 타이머 사용 방법

 

Handler() 클래스의 handleMessage(Message msg) 이벤트 프로시저때문에 한참을 고생했던 이유는
다름아닌 안드로이드 스튜디오에서 자동으로 임포트 해야하는 패키지를 추천해 주는데
잘못된 패키지를 추천해 주어서 handleMessage가 동작하지 않는 문제였다.

 

[안드로이드 개발 요약 - 3] Handler 를 이용한 타이머 동작 (반복수행)
handleMessage

 

handleMessage의 파라미터인 Message 클래스를 MessageStyle의 것으로 계속 추천을 해주는 터라
안드로이드 프로그래밍을 처음해보는 나에겐 뭐가 맞는지를 모르기 때문이였다.
Message가 속해 있는 패키지는 import android.os.Message; 이다.

댓글

💲 추천 글