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); } }
Diagram
see also 4. 에 있는 내용을 바탕으로 thread/handler/looper/message queue 의 그림을 그려봤다.See Also
- Handler 와 Looper, 2011. 8월
- Activity에 대해서 - Thread 와 Android Main Thread
- 안드로이드의 Handler #1. 설명 with Looper+MessageQueue
- [android/안드로이드] Handler 의 내부적 진실. :: 돼지왕 왕돼지 놀이터
댓글 없음:
댓글 쓰기