ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 안드로이드 HandlerThread
    안드로이드 2020. 5. 13. 23:23
    728x90

    오늘은 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

    댓글

Designed by Tistory.