AndroidでsynchronizedSortedSetを使う方法をわかりやすく解説【サンプルコード付き】
はじめに
この記事では、Androidアプリ開発においてCollections.synchronizedSortedSetを使用する方法を、実際のサンプルコードを交えながらステップごとに解説します。
synchronizedSortedSetは、スレッドセーフなSortedSet(ソート済みセット)を生成するための仕組みです。複数のスレッドから同時にアクセスされる可能性があるデータを扱う際に、要素が自動的にソートされつつ、安全に操作できるようになります。
本記事のサンプルでは、ユーザーが名前を入力して保存すると、TreeSet(自動的にソートされるセット)に追加され、その内容が同期化されたSortedSetを経由してListViewに表示される仕組みを実装します。
ステップ1:新しいプロジェクトを作成する
まず、Android Studioで新しいプロジェクトを作成しましょう。メニューから「File → New Project」を選択し、必要な情報をすべて入力して新規プロジェクトを作成してください。
ステップ2:レイアウトファイルを編集する
次に、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" tools:context = ".MainActivity" android:orientation = "vertical"> <EditText android:id = "@+id/name" android:layout_width = "match_parent" android:hint = "Enter Name" android:layout_height = "wrap_content" /> <LinearLayout android:layout_width = "wrap_content" android:layout_height = "wrap_content"> <Button android:id = "@+id/save" android:text = "Save" android:layout_width = "wrap_content" android:layout_height = "wrap_content" /> <Button android:id = "@+id/refresh" android:text = "Refresh" android:layout_width = "wrap_content" android:layout_height = "wrap_content" /> </LinearLayout> <ListView android:id = "@+id/listView" android:layout_width = "match_parent" android:layout_height = "wrap_content"> </ListView> </LinearLayout>
上記のコードでは、名前を入力するためのEditText、「Save」ボタン、「Refresh」ボタン、そしてデータを一覧表示するためのListViewを配置しています。ユーザーがSaveボタンをクリックするとデータが保存され、RefreshボタンをクリックするとListViewの表示内容が更新されます。
ステップ3:MainActivity.javaにコードを追加する
続いて、src/MainActivity.javaに以下のコードを記述します。
package com.example.andy.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import java.util.Collections;
import java.util.Set;
import java.util.ArrayList;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.Vector;
public class MainActivity extends AppCompatActivity {
EditText name;
ArrayAdapter arrayAdapter;
ArrayList<String> array_list;
SortedSet set = new TreeSet();
private ListView listView;
@Override
protected void onCreate(Bundle readdInstanceState) {
super.onCreate(readdInstanceState);
setContentView(R.layout.activity_main);
array_list = new ArrayList<String>();
name = findViewById(R.id.name);
listView = findViewById(R.id.listView);
findViewById(R.id.refresh).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
arrayAdapter.notifyDataSetChanged();
listView.invalidateViews();
listView.refreshDrawableState();
}
});
findViewById(R.id.save).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!name.getText().toString().isEmpty()) {
set.add(name.getText().toString());
Set syncSet = Collections.synchronizedSortedSet(set);
array_list.clear();
array_list.addAll(syncSet);
arrayAdapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, array_list);
listView.setAdapter(arrayAdapter);
Toast.makeText(MainActivity.this, "Inserted", Toast.LENGTH_LONG).show();
} else {
name.setError("Enter NAME");
}
}
});
}
}コードのポイント
このコードで重要なのは以下の処理です。
- TreeSetの宣言:
SortedSet set = new TreeSet()により、追加した要素が自動的にソートされるセットを用意しています。 - 同期化の適用:
Collections.synchronizedSortedSet(set)を呼び出すことで、スレッドセーフなSortedSetラッパーを取得しています。 - ListViewへの反映: 同期化されたセットの内容をArrayListにコピーし、ArrayAdapter経由でListViewに表示しています。
- 入力チェック: 名前が空の場合はエラーを表示し、正しく入力されていればToastで「Inserted」を通知します。
アプリケーションを実行してみる
それでは、アプリケーションを実行してみましょう。実際のAndroid端末をパソコンに接続していることを前提としています。Android Studioからアプリを実行するには、プロジェクト内のいずれかのアクティビティファイルを開き、ツールバーのRunアイコンをクリックします。表示された選択肢から自分のモバイルデバイスを選択すると、端末にデフォルト画面が表示されます。

上記の実行結果では、入力された名前がTreeSetの要素としてアダプターに追加されていることが確認できます。要素はアルファベット順など自動的にソートされて表示されるため、順序を保ちたいデータの一覧表示に非常に便利です。
まとめ
本記事では、AndroidでsynchronizedSortedSetを使用する方法を紹介しました。TreeSetをベースにすることで要素の自動ソートを実現しつつ、Collections.synchronizedSortedSetでスレッドセーフ性を確保できます。マルチスレッド環境で順序付きのコレクションを安全に扱いたい場合に、ぜひ活用してみてください。
-
【Android】スナックバー(Snackbar)の使い方をステップごとに解説
このチュートリアルでは、Androidアプリでスナックバー(Snackbar)を使用する方法を、サンプルコードとともに段階的に解説します。スナックバーは画面下部に短いメッセージを一時的に表示できるUIコンポーネントで、Toastとは異なり「再試行(RETRY)」などのアクションボタンを組み込めるのが大きな特徴です。 手順1:新規プロジェクトを作成する Android Studioを起動し、メニューから「File」→「New Project」を選択します。必要な項目をすべて入力して、新しいプロジェクトを作成しましょう。 手順2:レイアウトファイル(activity_main.xml)を編集する
-
【Android】NavigationViewの実装方法をステップごとに解説
この記事では、AndroidアプリでNavigationView(ナビゲーションビュー)を使用してドロワーメニューを実装する方法を、ステップごとに詳しく解説します。ハンバーガーアイコンから開閉できるサイドメニューは、多くのアプリで採用されている定番のUIです。ステップ1:新しいプロジェクトを作成するAndroid Studioを開き、File → New Project を選択して、必要な情報を入力し新しいプロジェクトを作成します。テンプレートには「Navigation Drawer Activity」を選ぶと、後の作業がスムーズになります。ステップ2:activity_main.xml にコ