본문 바로가기
TechNical/Android

Android] 핸들러를 이용해서 타이머를 만들어 보자.

by 강멍멍이 2011. 6. 27.
반응형
타이머 찍는거도 참 힘들구나..
쓰레드에다 값을 찍을려면 UI쓰래드가 찍어야 하고 뭐 어쩌고 저쩌고 그런게 있다.
일단 타이머 하나 만들어 보자.
토스트를 두개 찍어 봤다.
onClink에서 바로 하나 찍어 버리고 작업 끝나면 하나 찍었따.. 그냥 별 뜻 없다.

핸들러를 이용해서 값을 찍어 준다고 한다.
sendEmptyMessage(0);

작업 스레드는 메인 스레드의 위젯을 직접 건드릴 수 없어서 핸들러로 메시지를 보내서 처리를 한다.

sendEmptyMessage(0) 이거 막아 버리면 처음에 1 딱 찍히고 그 담부터 안 찍힌다.
스레드 부분을 다시 한번 더 읽어 봐야 겠다 ~_~;;

그리고.. 자꾸 까먹는게 있는데... 정수를 스트링으로 바꾸는 문법..
Integer.toString(mValue)

이걸 이렇게 문자로 안 바꿔 주고 숫자를 그냥 텍스트뷰에 이렇게 찍어 버리면 멋진 창을 볼 수 있다.
mText.setText(mValue);
어떻게 생긴 창이 뜨는지 궁금하면 주석 풀고 실행해 보자.
이거 때문에 발생한 DDMS에 찍힌 에러 로그 메세지는 밑도 끝도 없다.. 뭔 소린지 모르겠다. 이렇게 찍힌다.

06-26 15:34:17.644: ERROR/AndroidRuntime(752): FATAL EXCEPTION: main
06-26 15:34:17.644: ERROR/AndroidRuntime(752): android.content.res.Resources$NotFoundException: String resource ID #0x1
06-26 15:34:17.644: ERROR/AndroidRuntime(752):     at android.content.res.Resources.getText(Resources.java:201)
06-26 15:34:17.644: ERROR/AndroidRuntime(752):     at android.widget.TextView.setText(TextView.java:2857)
06-26 15:34:17.644: ERROR/AndroidRuntime(752):     at kei.mytimer.Mytimer$1.handleMessage(Mytimer.java:42)
06-26 15:34:17.644: ERROR/AndroidRuntime(752):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-26 15:34:17.644: ERROR/AndroidRuntime(752):     at android.os.Looper.loop(Looper.java:123)
06-26 15:34:17.644: ERROR/AndroidRuntime(752):     at android.app.ActivityThread.main(ActivityThread.java:3683)
06-26 15:34:17.644: ERROR/AndroidRuntime(752):     at java.lang.reflect.Method.invokeNative(Native Method)
06-26 15:34:17.644: ERROR/AndroidRuntime(752):     at java.lang.reflect.Method.invoke(Method.java:507)
06-26 15:34:17.644: ERROR/AndroidRuntime(752):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-26 15:34:17.644: ERROR/AndroidRuntime(752):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-26 15:34:17.644: ERROR/AndroidRuntime(752):     at dalvik.system.NativeStart.main(Native Method)


난 이거 보고 뭐가 잘 못 된건지 못 찾아 내겠다.. 망할.. 암튼 숫자인데 텍스트뷰에 그대로 찍어서 그렇다. 문자로 바꿔야 한다.


제발 좀 까먹지 말자. .-_-.. 근데 사실 까 먹는다고 하기 보다는 햇갈린다 ㅋ


[Mytimer.java]

package kei.mytimer;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class Mytimer extends Activity {    
 int mValue;
 TextView mText;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        mText = (TextView)findViewById(R.id.textv);        
        Button btnRun = (Button)findViewById(R.id.btn_run);
       
        btnRun.setOnClickListener(new Button.OnClickListener() {
   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    mValue = 0;
    mHandler.sendEmptyMessage(0);
    Toast.makeText(Mytimer.this, "what!!", Toast.LENGTH_SHORT).show();
   }
         
        });
    }
   
    Handler mHandler = new Handler(){
     public void handleMessage(Message msg){
      mValue++;
      //mText.setText(mValue);    // 이렇게 함 찍어보아요 ㅋㅋ
      mText.setText(Integer.toString(mValue));
      try{Thread.sleep(50);} catch(InterruptedException e){;}
      if (mValue < 30){
       mHandler.sendEmptyMessage(0);       // 메시지 안 날려 주면 변화 없다능.. 지가 지 또 부르는 거다.
      } else {
       Toast.makeText(Mytimer.this, "done!!", Toast.LENGTH_SHORT).show();
      }
     }
    };
}
반응형

댓글