Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

코틀린(Kotlin)으로 안드로이드에서 10초마다 메서드 반복 실행하기

안드로이드 앱을 개발하다 보면 특정 작업을 일정한 시간 간격으로 반복해서 실행해야 하는 경우가 자주 있습니다. 예를 들어 실시간 데이터를 주기적으로 갱신하거나, UI 상태를 일정 시간마다 확인해야 할 때가 그렇습니다. 이번 튜토리얼에서는 코틀린(Kotlin)Handler 클래스를 활용하여 안드로이드에서 특정 메서드를 10초(10,000밀리초)마다 반복 실행하는 방법을 단계별로 살펴보겠습니다.

핵심 원리 이해하기

이 기능의 핵심은 HandlerpostDelayed() 메서드입니다. postDelayed()는 지정한 지연 시간 후에 Runnable 객체를 실행하며, 실행된 Runnable 내부에서 다시 자기 자신을 postDelayed()로 등록하면 무한히 반복되는 주기적 실행 구조를 만들 수 있습니다. 또한 액티비티의 생명주기에 맞춰 onResume()에서 타이머를 시작하고 onPause()에서 중지하면, 화면이 백그라운드로 전환될 때 불필요한 리소스 낭비를 막을 수 있습니다.

Step 1 — 새 프로젝트 만들기

Android Studio를 열고 File → New Project 메뉴로 이동합니다. Empty Activity 템플릿을 선택하고 언어는 Kotlin으로 설정한 뒤, 필요한 정보를 모두 입력하여 새 프로젝트를 생성합니다.

Step 2 — 레이아웃 파일 작성 (res/layout/activity_main.xml)

아래 코드를 activity_main.xml에 추가합니다. 화면 상단에는 앱 제목을 표시하는 TextView가, 중앙에는 안내 문구를 표시하는 TextView가 배치됩니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="70dp"
        android:background="#008080"
        android:padding="5dp"
        android:text="TutorialsPoint"
        android:textColor="#fff"
        android:textSize="24sp"
        android:textStyle="bold" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Running a method every Ten seconds"
        android:textColor="@android:color/holo_orange_dark"
        android:textSize="16sp"
        android:textStyle="bold" />

</RelativeLayout>

Step 3 — MainActivity.kt 작성

아래 코드를 src/MainActivity.kt에 추가합니다. 이 코드가 바로 10초마다 메서드를 반복 실행하는 핵심 로직입니다.

import android.os.Bundle
import android.os.Handler
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

    var handler: Handler = Handler()
    var runnable: Runnable? = null
    var delay = 10000 // 10초 = 10,000밀리초

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        title = "KotlinApp"
    }

    override fun onResume() {
        handler.postDelayed(Runnable {
            handler.postDelayed(runnable!!, delay.toLong())
            Toast.makeText(
                this@MainActivity,
                "This method will run every 10 seconds",
                Toast.LENGTH_SHORT
            ).show()
        }.also { runnable = it }, delay.toLong())
        super.onResume()
    }

    override fun onPause() {
        super.onPause()
        handler.removeCallbacks(runnable!!)
    }
}

코드 동작 방식:

  • delay = 10000: 반복 주기를 밀리초 단위로 정의합니다. 10,000ms는 곧 10초입니다.
  • onResume(): 액티비티가 화면에 표시될 때 첫 번째 Runnable을 등록하고, 그 Runnable이 실행될 때마다 스스로를 다시 등록하여 주기적 실행을 유지합니다.
  • onPause(): 화면이 사라질 때 removeCallbacks()로 예약된 작업을 취소해 메모리 누수와 불필요한 실행을 방지합니다.

참고: API 레벨 30(Android 11)부터 인자 없는 Handler() 생성자는 deprecated 되었습니다. 최신 프로젝트에서는 아래처럼 메인 루퍼를 명시적으로 지정하는 것이 권장됩니다.

var handler = Handler(Looper.getMainLooper())

Step 4 — AndroidManifest.xml 확인

특별한 권한은 필요하지 않지만, 매니페스트에 메인 액티비티가 올바르게 등록되어 있는지 확인합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.example.q11">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

앱 실행 및 결과 확인

이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 기기를 컴퓨터에 USB로 연결했다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일을 하나 연 뒤, 툴바의 Run ▶ 버튼을 클릭하세요. 목록에서 연결된 모바일 기기를 선택하면 앱이 설치되고 실행됩니다.

앱이 실행되면 10초마다 화면 하단에 "This method will run every 10 seconds"라는 토스트 메시지가 나타나는 것을 확인할 수 있습니다. 홈 버튼을 눌러 앱을 백그라운드로 전환하면 토스트가 더 이상 표시되지 않으며, 다시 앱으로 돌아오면 반복 실행이 재개됩니다.

마무리 및 대안 방법

Handler 기반 접근법은 간단하고 호환성이 뛰어나지만, 더 현대적인 방식으로는 코루틴(Coroutines)repeat { delay(10000) } 패턴이나 WorkManager, AlarmManager 등을 활용할 수도 있습니다. 백그라운드에서도 안정적으로 주기 작업을 수행해야 한다면 WorkManager를, 정확한 시간에 실행해야 한다면 AlarmManager를 검토해 보시기 바랍니다. 포그라운드 UI 갱신 용도라면 이번 예제처럼 Handler + 생명주기 연동만으로도 충분히 깔끔하게 구현할 수 있습니다.