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

안드로이드 ListView에서 동기화 리스트(Synchronized List) 사용하는 방법

이 글에서는 안드로이드 ListView에서 동기화된 리스트(Collections.synchronizedList)를 사용하는 방법을 단계별 예제와 함께 살펴봅니다.

동기화된 리스트란 무엇인가?

Collections.synchronizedList()는 일반적인 ArrayList 같은 컬렉션을 스레드 안전(thread-safe)한 형태로 감싸 주는 메서드입니다. 멀티스레드 환경에서 여러 스레드가 동시에 하나의 리스트에 접근하면 데이터가 손상되거나 예기치 않은 오류가 발생할 수 있습니다. 동기화된 리스트를 사용하면 이러한 문제를 예방하고 데이터의 일관성을 유지할 수 있습니다.

1단계 − 새 프로젝트 만들기

Android Studio에서 File ⇒ New Project로 이동한 후, 필요한 모든 정보를 입력하여 새 프로젝트를 생성합니다.

2단계 − 레이아웃 작성(activity_main.xml)

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    android:layout_marginTop="30dp"
    tools:context=".MainActivity">
    <EditText
        android:id="@+id/edit_query"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/buttonPanel"
        android:text="Check"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <ListView
        android:id="@+id/list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </ListView>
</LinearLayout>

위 코드에는 EditText, Button, ListView가 배치되어 있습니다. 사용자가 EditText에 값을 입력한 뒤 버튼을 클릭하면, 입력된 값이 ListView의 기존 항목들과 비교되어 유효성 검사가 진행됩니다.

3단계 − MainActivity.java 코드 추가

src/MainActivity.java 파일에 아래 코드를 작성합니다.

package com.example.myapplication;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

public class MainActivity extends AppCompatActivity {
    ListView list;
    String[] mobileArray = {"Android", "IPhone", "WindowsMobile", "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X"};
    EditText edit_query;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        edit_query = findViewById(R.id.edit_query);
        list = findViewById(R.id.list);
        final ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(mobileArray));
        findViewById(R.id.buttonPanel).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(!edit_query.getText().toString().isEmpty()) {
                    if(arrayList.contains(edit_query.getText().toString())) {
                        Toast.makeText(MainActivity.this,"Already it is in list",Toast.LENGTH_LONG).show();
                    } else {
                        arrayList.add(edit_query.getText().toString());
                        ArrayAdapter adapter = new ArrayAdapter<String>(MainActivity.this,
                        android.R.layout.simple_list_item_1, Collections.synchronizedList(arrayList));
                        list.setAdapter(adapter);
                    }
                }
            }
        });

        ArrayAdapter adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, Collections.synchronizedList(arrayList));
        list.setAdapter(adapter);
    }
}

코드의 핵심은 Collections.synchronizedList(arrayList) 부분입니다. ArrayList를 동기화된 리스트로 변환한 뒤 ArrayAdapter에 전달함으로써, 멀티스레드 환경에서도 ListView 데이터를 안전하게 관리할 수 있습니다. 또한 버튼 클릭 시 contains() 메서드로 중복 여부를 먼저 확인하여, 이미 존재하는 값이면 토스트 메시지를 표시하고 그렇지 않으면 리스트에 새 항목을 추가한 후 어댑터를 갱신합니다.

앱 실행 및 결과 확인

이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 기기를 컴퓨터에 연결했다고 가정합니다. Android Studio에서 앱을 실행하려면 프로젝트의 액티비티 파일 중 하나를 연 뒤 툴바의 실행(Run) 아이콘을 클릭하고, 목록에서 자신의 모바일 기기를 선택하면 됩니다. 그러면 기기 화면에 아래와 같은 기본 화면이 표시됩니다.

안드로이드 ListView에서 동기화 리스트(Synchronized List) 사용하는 방법

위 결과에서 ListView에 새로운 요소가 정상적으로 추가된 것을 확인할 수 있습니다. 이제 동일한 값을 한 번 더 입력하면 유효성 검사가 수행되어 “Already it is in list”(이미 목록에 존재함)라는 토스트 메시지가 나타납니다.

참고 사항

예제 코드는 구버전 support 라이브러리(android.support.v7.app.AppCompatActivity)를 사용하고 있지만, 최신 Android Studio 프로젝트에서는 androidx.appcompat.app.AppCompatActivity를 사용해야 합니다. 또한 동기화된 리스트는 개별 메서드 호출만 동기화되므로, 리스트를 순회(iteration)할 때는 전체 반복 과정을 synchronized 블록으로 감싸 주는 것이 안전합니다.