안드로이드 쓰레드, 핸들러 사용하기
Android use the Thread, Handler
스레드는 동시 수행이 가능한 작업단위이다.
현재 수행되는 작업 이외의 기능을 동시에 처리하고자 할 때 새로운 스레드를 만들어 처리할 수 있다.
멀티스레드 방식은 같은 프로세스 안에 들어 있으면서 메모리 리소스를 공유하게 되므로 효율적인 처리가 가능하다.
하지만 동시에 리소스를 접근할 경우에 데드락이 발생할 수 있다.
이러한 동시 접근에 따른 데드락 문제를 해결하는 방법 중 하나는 작업을 순서대로 처리하는 것인데,
이러한 역할을 메인 스레드의 핸들러가 담당하게 된다.
A thread is a work unit that can be performed simultaneously.
A new thread can be created and processed when functions other than those currently performed are simultaneously handled.
The multi-threaded method is efficient because it is conrained within the same process and shares memory resourcse.
However, deadlock can occur when resources are accessed at the same time
One of the ways to resolve the deadlock of this simultaneous approach is to process the tasks in order
This role will be played by the handler of the main thread.
// 쓰레드 클래스
// Thread class
class ProgressThread extends Thread {
int value = 0;
public void run() {
while(true) {
if (value == 100) {
break;
}
value ++;
// 메시지를 핸들러로 전달
// forward message to handler
Message message = handler.obtainMessage();
Bundle bundle = new Bundle();
bundle.putInt("value", value);
message.setData(bundle);
handler.sendMessage(message);
try {
// 1초 동안 쉼
// 1 second sleep
Thread.sleep(1000);
} catch (Exception e){}
}
}
}
쓰레드 클래스를 내부 클래스로 하나 만들었다.
쓰레드를 사용해야 하기 때문에 Thread를 상속받았으며,
오버라이딩이 아닌 run 메소드 하나를 만들도록 한다.
run메소드에는 쓰레드에서 어떤 작업을 할 건지 만든다.
쓰레드에서 작업한 내용을 핸들러에 보내주어야 하는데, 핸들러는 메시지를 받아서 UI에 접근할 수 있기 때문이다
데이터를 번들에 담아서 다시 메세지 객체에 담아서 핸들러에 보내주면 된다.
A thread class was created as an inner class
Extends Thread because use the thread
Make sure to create a sun method, not an override
The run method creates what work to do with the thread
You have to send the contents of your work on the thread to the handler, because the handler can receive a message and access the UI
You cna put the data in the bundle, put it the message object, and send it to the handler.
// 핸들러 클래스
// handler class
class valueHandler extends Handler {
// 메시지를 받아서 UI를 접근하는 데에는 문제가 없다
// -> 핸들러는 메인 스레드에서 동작하는 걸로 생각
// There is no problem in accessing the UI by receiving a message
// -> think the handler works on the main thread
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 핸들러로 넘어온 데이터를 가져온다.
// imports data that has been transferred to the handler
Bundle bundle = msg.getData();
int value = bundle.getInt("value");
progressBar.setProgress(value);
textView.setText("현재 값 : " + value);
}
}
핸들러 클래스도 쓰레드 클래스와 마찬가지로 내부 클래스로 만들었다.
핸들로 클래스는 Handler을 상속받고 handleMessage 메소드를 오버라이딩 한다.
쓰레드에서 넘어온 데이터를 받고 여기서 UI에 보여주는 작업을 한다.
Handler class like thread class are made into inner class
Handler class extends Handler and override the handleMessage method
Receive data from thread and show it to the UI here
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ProgressThread thread = new ProgressThread();
// 스레드 시작 -> 시작은 start()
// start Thread -> start()
thread.start();
}
});
쓰레드의 시작은 쓰레드 클래스에서 만든 run 메소드가 아닌 쓰레드의 start() 메소드를 사용한다.
The start of the thread uses the start() method of the thread than the run method created in the thread class.
'[# 2]…My DevelopStory' 카테고리의 다른 글
안드로이드 툴바 햄버거 버튼 만들기 ~ Make the Android Toolbar hamburger button (0) | 2019.03.28 |
---|---|
안드로이드 AsyncTask 사용하기 ~ use the Android AsyncTask (0) | 2019.03.24 |
안드로이드 브로드캐스트 리시버 ~ Android BroadcastReceiver (0) | 2019.03.19 |
안드로이드 기본 정리 ~ Android Basic summary (0) | 2019.03.18 |
안드로이드 인플레이션 이해하기 ~ Understanding Android Inflation (0) | 2019.03.08 |