반응형

메인 핸들러와 스레드 핸들러를 만든 후 서로 메시지를 1초에 한번씩 주고받는 방식을 구현해보았다.

 

이때 메인은 Looper이 없는 이유가 메인 스레드는 기본적으로 Looper가 실행중인 상태이고

 

Thread에서만 Looper.prepare(), Looper.loop()를 통해 핸들러를 유지시켜 줄 수 있다.

 

우선 스레드 핸들러가 생성되면 메인으로 메시지를 보내게 되고 이때부터 num이 10이 될때까지 계속해서 1번씩 메시지 핑퐁을 하게 된다.

 

package com.example.myhandler;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    static final int THREAD_MSG = 1;
    static final int MAIN_MSG = 2;

    int num = 0;
    TextView textView;
    Handler tHandler;
    Handler mHandler = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);

            switch(msg.what) {
                case MAIN_MSG:
                    textView.setText("이것은 메인 핸들러!" + num);
                    if(num < 10){
                        num++;
                        tHandler.sendEmptyMessageDelayed(THREAD_MSG, 1000);
                    }
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = findViewById(R.id.text_view);

        Thread thread = new Thread(new MyRunnable());
        thread.start();
    }

    class MyRunnable implements Runnable {
        @Override
        public void run() {
            // 루퍼를 생성시켜 핸들러가 계속 메시지를 수신 할 수 있도록 한다.
            Looper.prepare();
            tHandler = new Handler(){
                @Override
                public void handleMessage(@NonNull Message msg) {
                    super.handleMessage(msg);

                    switch (msg.what) {
                        case THREAD_MSG:
                            mHandler.post(new Runnable() {
                                @Override
                                public void run() {
                                    textView.setText("이것은 스레드 핸들러! " + num);
                                    if(num < 10){
                                        num++;
                                        mHandler.sendEmptyMessageDelayed(MAIN_MSG, 1000);
                                    }
                                }
                            });
                        break;
                    }
                }
            };

            // hadler 생성 후 메인으로 메시지를 보낸다.
            mHandler.sendEmptyMessage(MAIN_MSG);
            Looper.loop();
        }
    }
}
반응형