액티비티 ANR(Application Not Responding)
: 액티비티가 사용자 이벤트에 반응하지 못하는 상황네트워킹
:스레드(Thread)
'메인 스레드', '개발자 스레드'까지 두개의 스레드가 동작
모든 스레드는독립적이고 병렬로 수행
작성 방법
상속
class MyThread extends Thread{
public void run(){}
}
class ...{
MyThread thread = new MyThread();
thread.start()
}
Runnable 인터페이스
class MyThread implements Runnable{
public void run(){}
}
class ...{
MyThread runnable = new MyThread();
Thread thread = new Thread(runnable);
thread.start()
}
핸들러(Handler)
: 개발자 스레드에서 발생한 데이터로 뷰 업데이트개발자 스레드에게 뷰에 대한 작업 의뢰하는 방법: post(), sendMessage()
함수 이용
Handler handler = new Hander() // Handler 객체 생성
// 뷰 관련 작업 담당 Runnable
class UIUpdate implements Runnable{ // 개발자 스레드에 의해 호출되는 클래스
public void run(){ textView.setText("sum:"+sum) } // 세번째 실행!!
}
// 개발자 스레드에서 뷰와 관련된 작업이 필요하다면 post()호출 후 UIThread에게 작업 의뢰
class MyThread implements Runnable{
int treadName;
public void run(){ // 첫번째 실행!!
for(int i=0; i<10; i++){
sum += i;
handler.post(new UIUpdate()); // 두번째 실행: 의뢰!!
try{
Thread.sleep(1000); // 10초대기
} catch (InterruptedException e){}
}
}
}
AsyncTask
클래스: 스레드-핸들러의 추상화 개념class MyAsyncTask extends AsyncTask<Void, Intenger, String>{
protected String doInBackground(void... params){} // 꼭 재정의해서 사용
protected void onProgressUpdate(Integer... values){}
protected void onPostExecute(String values){}
}
doInBackground(Params... params)
: 스레드에 의해 처리될 내용을 담는 함수(장시간 사용, run()에 해당하는 내용 작성)onPreExecute()
: AsyncTask작업 시작 전에 호출. AsyncTask에서 가장 먼저 한번 호출함onPostExecute(Result result)
: 모든 작업이 완료된 후 가장 마지막에 한번 호출(doInBackground 최종 값 얻기 위해)onProgressUpdate(Progress... value)
: doInBackground함수에 의해 중간 값 처리받아 호출Handler 역할
: 전달받은 메세지를 메세지 큐에 담아줌Looper 역할
: 메세지 큐에 메세지가 담긴 순간을 감지하는 역할 + 담긴 메세지 추출 후 handlerMessage() 함수를 호출해주는 역할UI 스레드 + 개발자 스레드 간의 연동이 가능한 이유: 내부에 Looper가 존재하기 때문이다.
예시: 개발자스레드 2개 간의 핸들러에 의한 연동
class OneThread extends Thread{
Handler oneHandler;
public void run(){
Lopper.perpare();
public void handleMessage(Message msg){
int data = msg.arg1
if(msg.what == 0)
Log.d("kkang","even data"+data);
else if(msg.what == 1)
Log.d("kkang","odd data"+data);
};
Looper.loop();
}
}
class TwoThread extends Thread{
public void run(){
Random random = new Random();
for(int i=0; i<10; i++){
int data = random.nextInt(10);
Message message = new Message();
if(data%2==0) message.what = 0;
else message.what=1;
message.arg1 = data;
oneThread.oneHandler.sendMessage(message); // 다른스레드 사용
}
}
}
// 생명주기 함수인 onDestory()에서 Looper 종료
protected void onDestory(){
super.onDestory()l
oneThread.oneHandler.getLooper().quit();
}