[컴][안드로이드] android Handler 개념 및 사용법


Handler

Handler 를 new 하게 되면 현재 new 를 실행한 thread 에 bind 되게 된다. 그래서 이 Handler 는 현재 thread 의 message queue 를 이용하게 되고, Handler 의 method 인 post() 나 sendMessage() 를 이용하면, 현재의 message queue 에 Runnable 또는 Message 가 들어가게 된다.

이렇게 message queue 에 저장된 녀석이 하나씩 처리되는데, 이때 다시 handler 가 Message() 는 handleMessage() 를 통해서 처리하고, Runnable 같은 것들은 정해진 command(run() 같은) 를 호출해서 처리하게 된다.

andorid 에서는 UI thread 에서 화면이 처리되는데, 이 UI thread 와 동시에 다른 thread 를 사용해야 할 일이 많이 생긴다. 이 때 가장 손쉬운 방법은 현재의 thread(UI thread) 에서 new Handler() 를 해 놓고, 새롭게 만든 thread 에서 특정작업을 하고, UI thread 에 반영될 녀석을 Handler 를 통해 보내는 방식으로 사용하면 된다.

아래 예제 소스이다.  main thread 가 ImageLoader 에서 img 가 없는 경우에 thread 에게 image 를 가져오라고 시키고, main thread 에서는 no_image 를 보여준다. 그 동안에 다른 thread 에서 이미지를 가져오고, 이 이미지를 imageView 에 set 하라고 하는 Runnable 을 Handler 를 통해 던진다. 그러면 no_image 가 set 되어 있던 곳에 가져온 이미지가 다시 set 될 것이다.
public class ImageLoader {
 ExecutorService mExecutorService = Executors.newFixedThreadPool(5);
    Handler mHandler=new Handler();//mHandler to display images in UI thread


 public void DisplayImage(ImageView imageView, String url){
  ...
  if(img == null)
  {
   mExecutorService.submit(new PhotosLoader(url, imageView));
  }
  imageView.setImageBitmap(no_image);
 }
 
 
 private class PhotosLoader implements Runnable {
  @Override
  public void run() {
   ...
   Bitmap pic = getImage(url);
   ...
   
   ShowImage si = new ShowImage(pic, imageView);
   mHandler.post(si);
   ...
  }
 }
}


public class ShowImage implements Runnable{
 ...
 public void run()
 {
  if(pic != null)
   imageView.setImageBitmap(pic);
  else
   imageView.setImageResource(no_image);
 }
}

ref.2 에 다른 예제도 있으니 한 번 살펴보기 바란다.


Diagram

see also 4. 에 있는 내용을 바탕으로 thread/handler/looper/message queue 의 그림을 그려봤다.



See Also

  1. Handler 와 Looper, 2011. 8월
  2. Activity에 대해서 - Thread 와 Android Main Thread
  3. 안드로이드의 Handler #1. 설명 with Looper+MessageQueue
  4. [android/안드로이드] Handler 의 내부적 진실. :: 돼지왕 왕돼지 놀이터



Reference

  1. http://developer.android.com/reference/android/os/Handler.html
  2. http://m.blog.naver.com/PostView.nhn?blogId=akj61300&logNo=80131663053

댓글 없음:

댓글 쓰기