카테고리 없음
안드로이드 - 스레드와 핸들러 예제실습
Great king
2019. 11. 18. 23:43
스레드란
- 스레드는 하나의 프로세스 내에서 실행되는 작업의 단위를 말하며, 하나의 운영 체계에서 여러 개의 프로세스가 동시에 실행되는 환경이 멀티태스킹이고, 하나의 프로세스 내에서 다수의 스레드가 동시에 수행되는 것이 멀티스레딩이다.
핸들러란
- 안드로이드에서는 화면UI에 접근하는 것을 막아두고 실행 시 생성되는 메인 스레드를 통해서만 화면 UI를 변경할 수 있기 때문에 핸들러를 통해서 메인 스레드에 접근하여 UI를 수정한다.
- 핸들러는 메시지처리 방식과 Runable객체 실행방식이 있다.
안드로이드 핸들러 (예제)
메시지 처리 방식
public class MainActivity extends AppCompatActivity {
Button btnStart;
TextView tvResult;
int value=0;
MainHandler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnStart = findViewById(R.id.btnStart);
tvResult = findViewById(R.id.tvResult);
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
BackgroundThread thread = new BackgroundThread();
thread.start();
}
});
handler = new MainHandler();
}
class BackgroundThread extends Thread{
public void run() {
for (int i=0; i<10; i++){
try {
Thread.sleep(1000);
}catch (Exception e){}
value += 1;
Log.d("Thread", "value: " + value);
Message message = handler.obtainMessage();
Bundle bundle = new Bundle();
bundle.putInt("value",value);
message.setData(bundle);
handler.sendMessage(message);
}
}
}
class MainHandler extends Handler{
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
Bundle bundle = msg.getData();
int value = bundle.getInt("value");
tvResult.setText("value: "+value);
}
}
}
Runable 객체 실행방식
public class MainActivity extends AppCompatActivity {
Button btnStart;
TextView tvResult;
int value=0;
Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnStart = findViewById(R.id.btnStart);
tvResult = findViewById(R.id.tvResult);
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
BackgroundThread thread = new BackgroundThread();
thread.start();
}
});
}
class BackgroundThread extends Thread{
public void run() {
for (int i=0; i<10; i++){
try {
Thread.sleep(1000);
}catch (Exception e){}
value += 1;
Log.d("Thread", "value: " + value);
handler.post(new Runnable() {
@Override
public void run() {
tvResult.setText("value 값: "+value);
}
});
}
}
}
}