개발/JAVA
[Android] Thread로 간단한 처리해보기
joon95
2023. 6. 20. 13:33
반응형
서론
갑작스럽게 회사 후임이 안드로이드를 물어봐서 간단히 테스트 글을 적어본다.
요구사항은 시크바(SeekBar)를 조절하면서 지속적으로 다른 곳에 데이터를 전송하는 내용이다.
시크바란?
시크바는 사용자가 범위 내에서 값을 선택할 수 있도록 도와주는 막대 형태의 뷰입니다. 음량/밝기 조절, 이미지 필터 적용, 동영상 재생 등 다양한 곳에 활용됩니다.
결과적으로 사용자가 바를 터치하고 있는 상태의 데이터를 지속적으로 전달해야한다.
(뭐 데이터가 변경될때만 보내면 간단한데, 변경이 아닌 사용자가 누르고 있는 상태에 대한 값을 보내고싶다고 했다)
그래서 Thread를 이용해서 0.3초마다 실행할 수 있도록 구현하고자한다.
MainActivity
시크바의 리스너함수 start에서 Thread를 실행, stop에서 Thread를 종료시켰다.
전역변수로 데이터를 보관하여 변경점에 대한 데이터를 가지고 있는다.
public class MainActivity extends AppCompatActivity {
ExampleThread thread;
static int data=0;
TextView txtView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtView = findViewById(R.id.text);
SeekBar bar = findViewById(R.id.seekbar);
bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){
@Override
public void onProgressChanged(SeekBar p1, int p2, boolean p3)
{
data=p2;
}
@Override
public void onStartTrackingTouch(SeekBar p1)
{
thread = new ExampleThread();
thread.start();
}
@Override
public void onStopTrackingTouch(SeekBar p1)
{
if(thread != null && thread.isAlive()){
thread.interrupt();
txtView.setText("데이터 전송 중지(" + data+")");
}
}
});
}
private class ExampleThread extends Thread {
@Override
public void run() {
while(!Thread.currentThread().isInterrupted()){
try {
// 실제 로직
Log.d("onProgressChange", "값:" + data);
// UI에 적용
runOnUiThread(new Runnable() {
@Override
public void run() {
txtView.setText("실시간데이터전송중..." + data);
}
});
// 작업대기
Thread.sleep(300); // 0.3초간 Thread를 잠재운다
} catch (InterruptedException e) {
//e.printStackTrace();
this.interrupt();
}
}
}
}
}
activity_main.xml
시크바와 간단히 상태를 보여줄 텍스트뷰를 넣어주었다.
<?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">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:id="@+id/text"
android:textSize="30dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<SeekBar
android:id="@+id/seekbar"
android:layout_width="match_parent"
android:layout_height="150dp"
android:max="100"/>
</androidx.constraintlayout.widget.ConstraintLayout>
결과화면
1. 사용자가 시크바를 누르면 Thread가 동작한다.
2. Thread는 시크바의 값을 0.3초마다 출력한다.
3. 사용자가 시크바 클릭을 해지하면 Thread가 멈춘다.
오랜만에 안드로이드를 만지니 재밌었다.(옛날 생각)...
반응형