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

안드로이드 로더(Loader) 사용법 완벽 가이드

안드로이드에서 로더(Loader)는 백그라운드에서 데이터를 비동기적으로 불러오고, 화면 회전 등 구성 변경 시에도 결과를 유지해 주는 컴포넌트입니다. 이 글에서는 로더를 활용해 연락처 목록을 화면에 표시하는 예제를 단계별로 살펴보겠습니다.

Step 1 — 새 프로젝트 생성

Android Studio를 실행하고 File → New Project 메뉴로 이동한 뒤, 필요한 정보를 모두 입력하여 새 프로젝트를 생성합니다.

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

아래 코드를 activity_main.xml 파일에 추가합니다.

<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "https://schemas.android.com/apk/res/android"
    android:orientation = "vertical"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent">

    <ListView
        android:id = "@+id/list"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:layout_centerHorizontal = "true"
        android:layout_centerVertical = "true" />
</LinearLayout>

위 코드는 연락처 이름을 표시하기 위한 ListView 하나를 포함하는 세로 방향 LinearLayout입니다.

Step 3 — 메인 액티비티 작성 (src/MainActivity.java)

아래 코드를 MainActivity.java에 추가합니다.

import android.Manifest;
import android.content.CursorLoader;
import android.content.Loader;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.SimpleCursorAdapter;
import android.widget.ListView;

public class MainActivity extends FragmentActivity implements android.app.LoaderManager.LoaderCallbacks<Cursor> {
    private static final int LOADER_CONTACTS = 100;
    private static final int PERMISSION_CONTACTS = 101;
    private static final String[] PROJECTION = {ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME};
    ListView lstContact;
    SimpleCursorAdapter adapter;
    String[] from = {ContactsContract.Contacts.DISPLAY_NAME};
    int[] to = {android.R.id.text1};

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, null, from, to, 0);
        ListView listView = (ListView) findViewById(R.id.list);
        listView.setAdapter(adapter);
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, PERMISSION_CONTACTS);
        } else {
            getLoaderManager().initLoader(LOADER_CONTACTS, null, this);
        }
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle bundle) {
        if (id == LOADER_CONTACTS) {
            return new CursorLoader(this, ContactsContract.Contacts.CONTENT_URI, PROJECTION, null, null, null);
        } else {
            return null;
        }
    }

    @Override
    public void onLoadFinished(android.content.Loader<Cursor> loader, Cursor data) {
        adapter.swapCursor(data);
        adapter.notifyDataSetChanged();
    }

    @Override
    public void onLoaderReset(android.content.Loader<Cursor> loader) {
        adapter.swapCursor(null);
    }
}

코드 핵심 요약

  • 권한 확인: 연락처 읽기 권한(READ_CONTACTS)이 없으면 사용자에게 권한을 요청합니다.
  • onCreateLoader(): 로더 ID가 일치하면 CursorLoader를 생성하여 연락처 제공자(Contacts Provider)에서 데이터를 조회합니다.
  • onLoadFinished(): 로딩이 완료되면 swapCursor()로 어댑터의 커서를 교체하고 리스트를 갱신합니다.
  • onLoaderReset(): 로더가 초기화될 때 기존 커서를 해제합니다.

앱 실행하기

실제 안드로이드 기기를 컴퓨터에 연결한 상태라고 가정하고 진행합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run(실행) 아이콘을 클릭하세요. 옵션 목록에서 본인의 모바일 기기를 선택하면, 기기 화면에 아래와 같은 결과가 표시됩니다.

안드로이드 로더(Loader) 사용법 완벽 가이드

참고 사항

로더(Loader) API는 Android P(API 28)부터 공식적으로 지원 중단(deprecated)되었습니다. 최신 프로젝트에서는 ViewModel과 LiveData, 또는 Kotlin Coroutines와 Flow를 사용하는 것이 권장되므로, 신규 개발 시에는 이를 참고하시기 바랍니다.