이 글은 PC 버전 TISTORY에 최적화 되어있습니다.
서론
이전에 Thread, Handler, Looper를 통한 Background 처리에 대해서 알려드린 적이 있었는데요, 이번에는 Handler의 사용법을 알아보고자 합니다. Handler에 대한 개념을 잘 모르시는 분은 앞 장을 먼저 보고 오시길 바라겠습니다.
단독 사용한 Handler
저번 포스팅에서 설명드린 간단한 Handler 사용법입니다.
기본 생성자를 통해 Handler를 생성하면, 생성되는 Handler는 해당 Handler를 호출한 스레드의 MessageQueue와 Looper에 자동 연결된다.
public class MainActivity extends AppCompatActivity { Handler mHandler = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mHandler = new Handler(); Thread t = new Thread(new Runnable(){ @Override public void run() { // UI 작업 수행 X mHandler.post(new Runnable(){ @Override public void run() { // UI 작업 수행 O } }); } }); t.start(); } }
이런 식으로 메인 스레드에서 Handler를 생성하면 해당 Handler는 호출한 스레드의 메시지큐와 루퍼에 자동 연결 되므로 다른 스레드에서 Handler를 통해 메시지를 전달하면 메인 스레드(UI 스레드)에서 UI 작업을 가능하게 하는 것입니다.
Message를 사용하는 Handler
앞서 설명드렸듯이 안드로이드에선 메인스레드와 서브스레드 간에 Handler를 통해 메시지를 전달하여 메시지 큐에 저장하는 방식의 통신을 사용합니다. 메시지 큐는 FIFO(First In First OUT) 방식으로 먼저 전달 받은 메시지를 먼저 처리하게되죠. Handler의 메시지 전달 함수는 아래의 두 가지가 있습니다.
Handler.sendEmptyMessage(int what)
Message what(ID) 를 사용할 경우 사용하는 메서드
Handler.sendMessage(Message msg)
Message what, arg1, obj 등 ID와 정보 등을 같이 사용하는 메서드
아래 코드를 천천히 뜯어보시면 쉽게 이해가실 것 입니다.
public class MainActivity extends AppCompatActivity { public static final int SEND_INFORMATION = 0; public static final int SEND_STOP = 1; TextView textView; Button startButton; Button stopButton; Thread thread; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textview); startButton = (Button) findViewById(R.id.button); stopButton = (Button) findViewById(R.id.button2); // Thread Strat 버튼을 클릭했을 때 Thread를 시작 startButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { thread = new Thread(); thread.start(); } }); // Thread 를 Stop 시키며 handler에게 SEND_STOP 메시지를 보냄 stopButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { handler.sendEmptyMessage(SEND_STOP); } }); } final Handler handler = new Handler(){ @Override public void handleMessage(Message msg){ switch (msg.what) { case SEND_INFORMATION: textView.setText(Integer.toString(msg.arg1) + msg.obj); break; case SEND_STOP: thread.stopThread(); textView.setText("Thread 가 중지됨."); break; default: break; } } }; class Thread extends java.lang.Thread { boolean stopped = false; int i = 0; public Thread(){ stopped = false; } public void stopThread() { stopped = true; } @Override public void run() { super.run(); while(stopped == false) { i++; // 메시지 얻어오기 Message message = handler.obtainMessage(); // 메시지 ID 설정 message.what = SEND_INFORMATION; // 메시지 내용 설정 (int) message.arg1 = i; // 메시지 내용 설정 (Object) String information = new String("초 째 Thread 동작 중입니다."); message.obj = information; // 메시지 전 handler.sendMessage(message); try { // 1초 씩 딜레이 부여 sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
반응형
'Frontend > Android' 카테고리의 다른 글
[안드로이드] Bitmap 최적화 로딩 (Bitmap Resize) (4) | 2016.07.17 |
---|---|
[안드로이드] 다른 액티비티의 함수 호출 방법(오류) -> 싱글톤 패턴 (2) | 2016.07.14 |
[안드로이드] RecyclerView 예제 (17) | 2016.07.12 |
[안드로이드] RecyclerView란? (RecyclerView와 ListView 차이) (6) | 2016.07.11 |
[안드로이드] 안드로이드 메모리 관리 (Weak Reference와 Soft Reference) (0) | 2016.07.08 |
[안드로이드] AsyncTask란? (개념 및 사용법) (3) | 2016.07.07 |