Android

Handler(feat. Message Queue)

김한토 2024. 9. 30. 13:44
반응형
SMALL

핸들러(Handler)는 특정 이벤트나 상황이 발생했을 때, 그에 대한 특정 작업을 수행하도록 미리 작성된 코드이다. 

 

이해하기 쉽게 설명하자면, 아침에 일어날 때 알람을 맞춰논다. 알람을 맞춘 시간이 되면 알람이 울리면서 일어나게 되는데, 이때 '알람 소리가 울리는 시간'이 이벤트고, 알람이 울리는 그 순간에 '알림음이 울림' 이 핸들러다. 즉, 어떤 일이 벌어질 때, 그에 맞는 행동을 하도록 미리 정해놓은 코드를 핸들러라고 할 수 있다. 

 

메세지 큐(Message Queue)

: 비동기 통신을 위한 데이터 구조로, 프로세스 간 또는 앱 간에 메세지를 안전하게 전송하고 처리할 수 있도록 돕는 시스템이다. 

- 메세지 큐를 사용하면 작업을 비동기적으로 처리할 수 있어 UI 스레드의 차단을 방지할 수 있다.

- 작업 관리 : 여러 작업을 순서대로 처리할 수 있도록 메세지를 큐에 저장하고 하나씩 꺼내여 처리할 수 있다. 

 

Exmaple Code

import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;

import java.util.LinkedList;
import java.util.Queue;

public class TaskExample {
    private static final String TAG = "TaskExample";
    private static final int MSG_RUN_TASK = 1;

    private Queue<Runnable> taskQueue = new LinkedList<>();
    private Handler handler;
	
    
    public TaskExample() {
        handler = new Handler(Looper.getMainLooper(), msg -> {
            switch (msg.what) {
                case MSG_RUN_TASK:
                    executeNextTask();
                    return true;
                default:
                    return false;
            }
        });
    }
	
    //새로운 작업을 큐에 추가한다. 
    public void addTask(Runnable task) {
        taskQueue.add(task);
    }

	//첫 번째 작업을 실행하기 위해 핸들러에 메시지를 보낸다. 
    public void executeTasks() {
        Message message = handler.obtainMessage(MSG_RUN_TASK);
        handler.sendMessage(message);
        //handler.sendMessageDelayed(message, 2000); // 2초 후에 메시지 전송
    }

	//큐에서 다음 작업을 가져와 실행한다. 다음 작업을 실행하기 위해 executeTasks를 재귀적으로 실행한다. 
    private void executeNextTask() {
        if (!taskQueue.isEmpty()) {
            Runnable nextTask = taskQueue.poll();
            if (nextTask != null) {
                handler.post(() -> {
                    nextTask.run();
                    executeTasks();
                });
            }
        }
    }

    public int getRegisteredTaskCount() {
        return taskQueue.size();
    }

    public static void main(String[] args) {
        TaskExample taskExample = new TaskExample();

        if(getRegisteredTaskCount() > 0) {
        	taskExample.executeTasks()
        }
    }
}

poll() : 가장 앞에 있는 작업을 꺼내서 반환

 

반응형
LIST