개발/java 쓰레드를 사용한 스탑워치 모듈 용소시 2015. 12. 9. 15:23 import java.util.Calendar; import android.os.Handler; import android.os.Message; import android.widget.TextView; public class StopWatch { boolean isAlive=false; boolean isThread=false; TimeCountDown tcd; TimeHandler handler; /** * 기본적인 스탑와치를 초기화함 * */ public StopWatch(TextView display,StopWatchListener listener){ handler=new TimeHandler(display,listener); } /** * 스탑와치의 시간을 주어줌 * */ public StopWatch(TextView display,StopWatchListener listener,long time){ handler=new TimeHandler(display,listener,time); display.setText(handler.getTimeFormat(time)); } public void start(){ if(!isThread){ this.isAlive=true; isThread=true; tcd=new TimeCountDown(handler); tcd.start(); } } public void stop(){ this.isAlive=false; this.isThread=false; tcd=null; } //Handler 클래스 /** * 스레드로부터 주기적으로 호출받아 시간판을 새로고침한다 * */ class TimeHandler extends Handler { TextView target; long startTime; StopWatchListener listener; // 제한시간 long limitTime = 2 * 60 * 1000; public TimeHandler(TextView target,StopWatchListener listener) { this.target = target; this.startTime = Calendar.getInstance().getTimeInMillis(); this.listener=listener; } public TimeHandler(TextView target,StopWatchListener listener,long time) { this.target = target; this.startTime = Calendar.getInstance().getTimeInMillis(); this.listener=listener; limitTime=time; } @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); // 시간계산알고리즘 //System.out.println("startTIme"+startTime); // System.out.println("limitTIme"+limitTime); // 남은시간=(시작시간+제한시간)-현재시간 long spandTime = startTime + limitTime - Calendar.getInstance().getTimeInMillis(); System.out.println("spandTIme"+spandTime); if (spandTime < 0) { if(isAlive){ listener.timeOut(); } isAlive = false; isThread=false; tcd=null; //soundPool.play(timeoutSound, 1, 1, 0, 0, 1); target.setText("00:00:00"); return; } target.setText(getTimeFormat(spandTime)); } /** * 남은시간을 형식에 맞게 변환해줌 * */ public String getTimeFormat(long spandTime){ Calendar spandCalendar = Calendar.getInstance(); spandCalendar.setTimeInMillis(spandTime); int minute = spandCalendar.get(Calendar.MINUTE); int second = spandCalendar.get(Calendar.SECOND); int mils = spandCalendar.get(Calendar.MILLISECOND); String str_minute = Integer.toString(minute); String str_second = Integer.toString(second); String str_mils = Integer.toString((int) (mils / 10)); if (minute < 10) { str_minute = "0" + minute; } if (second < 10) { str_second = "0" + second; } if (str_mils.length() == 1) { str_mils = "00"; } return str_minute + ":" + str_second + ":" + str_mils; } } //스레드 클레스 class TimeCountDown extends Thread { Handler handler; public TimeCountDown(Handler handler) { this.handler = handler; } public void run() { while (isAlive) { try { Thread.sleep(80); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } handler.sendEmptyMessage(0); System.out.println("Threading"); } System.out.println("Thread End"); } } } public interface StopWatchListener { /** * 시간모두 경과되었을때 호출되는 메소드 ***/ public void timeOut(); } 공유하기 URL 복사카카오톡 공유페이스북 공유엑스 공유 게시글 관리 구독하기용소시의 개맛 저작자표시 비영리