티스토리 뷰

반응형

UI 변경 작업은 UI Thread에서만 가능하다. 

따라서, 기본적인 백그라운드 작업 시 사용하는 Thread에서는 UI 변경작업을 할 수 없다. 

백그라운드 작업 시 UI 변경작업을 진행하기 위해서는 백그라운드에서 작업 중인 데이터를 UI Thread에 전달해줘야 하는데 이러한 전달 역할을 Handler가 해준다. 

 

1.Handler 객체를 UI Thread(Main Thread) 에서 생성하고, 생성한 Handler 객체를 이용하여 백그라운드로 작업할 Thread에서 Handler의 post 메소드를 이용하여 처리할 UI 로직을 Runnable 로 실행시킨다.

MainActivity {

 Handler handler = new Handler();

 MyThread extends Thread{

  Thread(){}

  run(){

   handler.post(new Runnable(){

    run(){

      // UI 관련 처리

    }

   });

  }

 }

}

 

2. 백그라운드로 실행되는 Thread 내에 Handler 객체를 Main의 Looper를 가져와서 생성한다. 

 MyThread extends Thread{

  Thread(){}

  run(){

   Handler handler = new Handler(Looper.getMainLooper());

   handler.post(new Runnable(){

    run(){ 

      // UI 관련 처리

    }

   });

  }

 }

 

3. 백그라운드로 실행되는 Thread 내에 runOnUiThread를 이용한다.

 MyThread extends Thread{

  Thread(){}

  run(){

   runOnUiThread( new Runnable(){

    run(){

      // UI 관련 처리

    }

   });

  }

 }

 

참조 : CodingInFlow - Looper, MessageQueue % Handler Explained - Android Studio Tutorial

* What is Looper ?? 

백그라운드 작업을 Thread로 진행하면서 UI 적용을 위해 UI Thread에 데이터를 전달하기 위해서는 작업들의 집합인 MessageQueue와 Thread가 종료되기 전까지 계속해서 작업을 처리할 수 있도록 하는 Looper 및 UIThread를 이용하는 데이터를 전달하는 Handler가 필요하다. 

 

* volatile 로 정의한 변수는 MainMemory 에 저장된 값을 CPU cache에 저장하여 해당 CPU cache에서 값을 읽어들이는 것이 아니라 변수 값을 읽을 때마다 MainMemory에 직접 read&write를 수행하는 것이다. 따라서, 멀티쓰레드 사용 시 변수 값의 불일치를 막아줄 수 있는데, 단!! 하나의 Thread만 read & write가 가능하고 나머지 Thread는 read만 수행할 경우에만 값의 불일치를 막을 수 있다. 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함