-
안드로이드 HandlerThread안드로이드 2020. 5. 13. 23:23728x90
오늘은 HandlerThread 에 대해 알아볼거에요
메인스레드에는 Looper와 MessageQueue 가 있어서 메시지들을 처리한다고 배웠어요
안드로이드는 작업스레드도 Looper와 MessageQueue 를 갖게 만들 수 있어요
이를 위한 클래스가 HandlerThread에요
사용법
HandlerThread handlerThread = new HandlerThread("이름"); // Looper 동작 시작 handlerThread.start(); // handlerThread(작업스레드)의 Looper 를 내부적으로 가리키는 핸들러 생성 // 이 핸들러는 post or sendMessage 호출 시 // 메인스레드의 Looper가 아닌 handlerThread의 looper로 메시지를 보내게 된다. Handler handler = new Handler(handlerThread.getLooper()); // 메시지 보내기 handler.post(...);
예제
<layout/activity_main.xml>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <Button android:id="@+id/btn" android:text="버튼" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
<MainActivity.java>
package kr.co.sample; import android.os.Bundle; import android.os.CountDownTimer; import android.os.Handler; import android.os.HandlerThread; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { Button btn; HandlerThread handlerThread; Handler handler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); handlerThread = new HandlerThread("MyTask"); handlerThread.start(); handler = new Handler(handlerThread.getLooper()); btn = findViewById(R.id.btn); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { handler.post(new Runnable() { @Override public void run() { try { Log.d("MyTask", "sleep 3sec"); // 3초간 잠들기 for (int i = 0; i < 3; i++) { Thread.sleep(1000); Log.d("MyTask", String.valueOf(i + 1)); } } catch (InterruptedException e) { e.printStackTrace(); } } }); Log.d("MyTask", "onClick Button!"); Toast.makeText(MainActivity.this, "Click", Toast.LENGTH_SHORT).show(); } }); } }
결과
클릭을 총 세 번 했는데 막힘 없이 클릭이 되고 있어요
동시에 작업 스레드의 MessageQueue 에 작업이 3 개가 들어갔고, 이를 하나씩 처리하는것을 알 수 있습니다~
'안드로이드' 카테고리의 다른 글
안드로이드 서비스(2) (0) 2020.05.21 안드로이드 서비스 (0) 2020.05.21 안드로이드 CountDownTimer (0) 2020.05.13 Android AsyncTask (0) 2020.05.10 안드로이드 Looper, Message Queue, Handler (0) 2020.05.09