이번 예제에서는 Timer, TimerTask를 이용해 타이머를 만들어 볼 예정입니다.
스틱코드라는 플러그인을 이용해서 빠르게 개발을 해볼 건데요
string과 int 형변환하는 코드
stickode.com/detail.html?no=1879
Timer, TimerTask 코드를 사용했습니다.
stickode.com/detail.html?no=1880
위의 두 포스팅을 즐겨찾기 추가 또는 팔로우하시면 좀 더 빠르게 개발하실 수 있습니다.
==========================================================================
먼저 타이머를 개발하기 전에 이번에 사용할 Timer와 TimerTask에 대해 알아보겠습니다.
java.util.Timer 클래스와 java.util.TimerTask 클래스는 JDK1.3에 새롭게 추가된 클래스입니다.
개발자가 정한 시간에 맞춰 한 번 또는 주기적으로 일어나서 정해진 작업을 하는 쓰레드 클래스입니다.
Timer는 schedule 메소드를 이용해서 작동시킬수 있습니다.
- 단발성 실행
public void schedule(TimerTask task, long delay)
- 연발성 실행
public void schedule(TimerTask task, long delay, long period)
- 종료
timer.cancel()
예제 코드입니다.
Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
// 반복실행할 구문
}
};
// timer 실행
timer.schedule(timerTask, 0, 1000);
// timer 종료
timer.cancel();
스틱코드 게시글에서도 예제를 확인하실 수 있습니다.
===========================================================================
이번에 개발한 타이머 화면입니다.
타이머 개발 시 사용한 레이아웃입니다.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:id="@+id/timeCountSettingLV"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginHorizontal="30dp"
app:layout_constraintBottom_toTopOf="@+id/startBtn"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<EditText
android:id="@+id/hourET"
android:layout_width="0dp"
android:layout_weight="1"
android:hint="00"
android:gravity="center"
android:layout_height="wrap_content"
android:inputType="number"/>
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:textColor="@color/black"
android:textSize="20dp"
android:text=":"
android:gravity="center"
app:layout_constraintBottom_toTopOf="@+id/startBtn"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/minuteET"
android:layout_width="0dp"
android:layout_weight="1"
android:hint="00"
android:gravity="center"
android:layout_height="wrap_content"
android:inputType="number"/>
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:textColor="@color/black"
android:textSize="20dp"
android:text=":"
android:gravity="center"
app:layout_constraintBottom_toTopOf="@+id/startBtn"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/secondET"
android:layout_width="0dp"
android:layout_weight="1"
android:hint="00"
android:gravity="center"
android:layout_height="wrap_content"
android:inputType="number"/>
</LinearLayout>
<LinearLayout
android:id="@+id/timeCountLV"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:visibility="gone"
android:layout_marginHorizontal="30dp"
app:layout_constraintBottom_toTopOf="@+id/startBtn"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/hourTV"
android:layout_width="0dp"
android:layout_weight="1"
android:textSize="20dp"
android:gravity="center"
android:textColor="@color/black"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:textColor="@color/black"
android:textSize="20dp"
android:text=":"
android:gravity="center"
app:layout_constraintBottom_toTopOf="@+id/startBtn"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/minuteTV"
android:layout_width="0dp"
android:layout_weight="1"
android:textSize="20dp"
android:gravity="center"
android:textColor="@color/black"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:textColor="@color/black"
android:textSize="20dp"
android:text=":"
android:gravity="center"
app:layout_constraintBottom_toTopOf="@+id/startBtn"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/secondTV"
android:layout_width="0dp"
android:layout_weight="1"
android:textSize="20dp"
android:gravity="center"
android:textColor="@color/black"
android:layout_height="wrap_content"/>
</LinearLayout>
<TextView
android:id="@+id/finishTV"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:textColor="@color/black"
android:textSize="30dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/startBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="시작"
android:layout_marginBottom="100dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
첫 번째로 레이아웃에 맞게 자바 코드를 짜줍니다.
public class MainActivity extends AppCompatActivity {
LinearLayout timeCountSettingLV, timeCountLV;
EditText hourET, minuteET, secondET;
TextView hourTV, minuteTV, secondTV, finishTV;
Button startBtn;
int hour, minute, second;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timeCountSettingLV = (LinearLayout)findViewById(R.id.timeCountSettingLV);
timeCountLV = (LinearLayout)findViewById(R.id.timeCountLV);
hourET = (EditText)findViewById(R.id.hourET);
minuteET = (EditText)findViewById(R.id.minuteET);
secondET = (EditText)findViewById(R.id.secondET);
hourTV = (TextView)findViewById(R.id.hourTV);
minuteTV = (TextView)findViewById(R.id.minuteTV);
secondTV = (TextView)findViewById(R.id.secondTV);
finishTV = (TextView)findViewById(R.id.finishTV);
startBtn = (Button)findViewById(R.id.startBtn);
}
}
두 번째로 시작 버튼을 눌렀을때 처리코드를 작성합니다.
시작버튼 누름 -> 작성된 시분초를 가져옴 -> 타이머 시작 -> 시간이 지나면 타이머 꺼짐
이런 흐름입니다.
// 시작버튼 이벤트 1처리
startBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
timeCountSettingLV.setVisibility(View.GONE);
timeCountLV.setVisibility(View.VISIBLE);
hourTV.setText(hourET.getText().toString());
minuteTV.setText(minuteET.getText().toString());
secondTV.setText(secondET.getText().toString());
hour = Integer.parseInt(hourET.getText().toString());
minute = Integer.parseInt(minuteET.getText().toString());
second = Integer.parseInt(secondET.getText().toString());
Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
// 반복실행할 구문
// 0초 이상이면
if(second != 0) {
//1초씩 감소
second--;
// 0분 이상이면
} else if(minute != 0) {
// 1분 = 60초
second = 60;
second--;
minute--;
// 0시간 이상이면
} else if(hour != 0) {
// 1시간 = 60분
second = 60;
minute = 60;
second--;
minute--;
hour--;
}
//시, 분, 초가 10이하(한자리수) 라면
// 숫자 앞에 0을 붙인다 ( 8 -> 08 )
if(second <= 9){
secondTV.setText("0" + second);
} else {
secondTV.setText(Integer.toString(second));
}
if(minute <= 9){
minuteTV.setText("0" + minute);
} else {
minuteTV.setText(Integer.toString(minute));
}
if(hour <= 9){
hourTV.setText("0" + hour);
} else {
hourTV.setText(Integer.toString(hour));
}
// 시분초가 다 0이라면 toast를 띄우고 타이머를 종료한다..
if(hour == 0 && minute == 0 && second == 0) {
timer.cancel();//타이머 종료
finishTV.setText("타이머가 종료되었습니다.");
}
}
};
//타이머를 실행
timer.schedule(timerTask, 0, 1000); //Timer 실행
}
});
여기에서 개발을 빨리 하고 싶다면 위에 올려놓은 int string 형 변환 코드와 timer, timerTask코드를 사용하면 됩니다.
=========================================================================
타이머 개발 시 사용한 자바 전체 코드입니다.
package com.example.stickcode_timer;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
LinearLayout timeCountSettingLV, timeCountLV;
EditText hourET, minuteET, secondET;
TextView hourTV, minuteTV, secondTV, finishTV;
Button startBtn;
int hour, minute, second;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timeCountSettingLV = (LinearLayout)findViewById(R.id.timeCountSettingLV);
timeCountLV = (LinearLayout)findViewById(R.id.timeCountLV);
hourET = (EditText)findViewById(R.id.hourET);
minuteET = (EditText)findViewById(R.id.minuteET);
secondET = (EditText)findViewById(R.id.secondET);
hourTV = (TextView)findViewById(R.id.hourTV);
minuteTV = (TextView)findViewById(R.id.minuteTV);
secondTV = (TextView)findViewById(R.id.secondTV);
finishTV = (TextView)findViewById(R.id.finishTV);
startBtn = (Button)findViewById(R.id.startBtn);
// 시작버튼 이벤트 1처리
startBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
timeCountSettingLV.setVisibility(View.GONE);
timeCountLV.setVisibility(View.VISIBLE);
hourTV.setText(hourET.getText().toString());
minuteTV.setText(minuteET.getText().toString());
secondTV.setText(secondET.getText().toString());
hour = Integer.parseInt(hourET.getText().toString());
minute = Integer.parseInt(minuteET.getText().toString());
second = Integer.parseInt(secondET.getText().toString());
Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
// 반복실행할 구문
// 0초 이상이면
if(second != 0) {
//1초씩 감소
second--;
// 0분 이상이면
} else if(minute != 0) {
// 1분 = 60초
second = 60;
second--;
minute--;
// 0시간 이상이면
} else if(hour != 0) {
// 1시간 = 60분
second = 60;
minute = 60;
second--;
minute--;
hour--;
}
//시, 분, 초가 10이하(한자리수) 라면
// 숫자 앞에 0을 붙인다 ( 8 -> 08 )
if(second <= 9){
secondTV.setText("0" + second);
} else {
secondTV.setText(Integer.toString(second));
}
if(minute <= 9){
minuteTV.setText("0" + minute);
} else {
minuteTV.setText(Integer.toString(minute));
}
if(hour <= 9){
hourTV.setText("0" + hour);
} else {
hourTV.setText(Integer.toString(hour));
}
// 시분초가 다 0이라면 toast를 띄우고 타이머를 종료한다..
if(hour == 0 && minute == 0 && second == 0) {
timer.cancel();//타이머 종료
finishTV.setText("타이머가 종료되었습니다.");
}
}
};
//타이머를 실행
timer.schedule(timerTask, 0, 1000); //Timer 실행
}
});
}
}
이렇게 타이머를 빠르게 만들어보았습니다.
'안드로이드 자바' 카테고리의 다른 글
[Java][Android] Service로 음악 재생하는 앱 빠르게 만들기 (0) | 2021.02.10 |
---|---|
[Java][Android] 메모장 만들기(1. 메모 작성 및 저장) (2) | 2021.02.09 |
[Java][Android] 쉐어드프리퍼런스 회원가입 빠르게 만들기 (0) | 2021.02.07 |
[Java][Android] 안드로이드 스레드, 핸들러를 이용한 스탑워치 (0) | 2021.02.06 |
[Java][Android] 안드로이드 - 웹뷰(WebView) 만들기 (0) | 2021.02.05 |