Android
 Computer >> コンピューター >  >> プログラミング >> Android

Androidでグローバルコンテキストを使ってJSONオブジェクトをシングルトンとして保存する方法

具体例に入る前に、まず「シングルトンデザインパターン」とは何かを確認しておきましょう。シングルトンとは、あるクラスのインスタンス生成をアプリケーション全体で1つだけに制限するデザインパターンです。主な用途としては、同時実行(並行処理)の制御や、アプリケーション全体からデータストアへアクセスするための窓口を一元的に設けることなどが挙げられます。

この記事では、Androidアプリにおいてグローバルコンテキスト(Applicationコンテキスト)を使用して、JSONオブジェクトをシングルトンとして保存・取得する方法を解説します。

ステップ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">
    <Button
        android:id = "@+id/show"
        android:text = "save json in singleTone"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content" />
</LinearLayout>

上記コードではボタンを1つだけ配置しています。ユーザーがこのボタンをタップすると、ToastでJSONオブジェクトの中身が表示される仕組みです。

ステップ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.Button;
import android.widget.Toast;
import org.json.JSONException;
import org.json.JSONObject;
public class MainActivity extends AppCompatActivity {
    Button show;
    JSONObject jsonObject;
    singleTonExample singletonexample;
    {
        try {
            jsonObject = new JSONObject("{\"balance\": 1000.21, \"num\":100, \"is_vip\":true, \"name\":\"foo\"}");
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        show = findViewById(R.id.show);
        singletonexample = singleTonExample.getInstance();
        singletonexample.init(getApplicationContext());
        show.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                singletonexample.storeJson(jsonObject);
                Toast.makeText(singleTonExample.get(), singletonexample.getJSON(), Toast.LENGTH_LONG).show();
            }
        });
    }
}

ここでは singleTonExample をシングルトンクラスとして利用しています。続いて、その本体となるクラスを作成しましょう。

ステップ4:シングルトンクラスを作成する

singleTonExample.java を新規作成し、以下のコードを追加します。

package com.example.andy.myapplication;
import android.content.Context;
import org.json.JSONObject;
public class singleTonExample {
    private Context appContext;
    JSONObject i1;
    private static final singleTonExample ourInstance = new singleTonExample();
    public void init(Context context) {
        if(appContext == null) {
            this.appContext = context;
        }
    }
    private Context getContext() {
        return appContext;
    }
    public static Context get() {
        return getInstance().getContext();
    }
    public static synchronized singleTonExample getInstance() {
        return ourInstance;
    }
    private singleTonExample() { }
    public void storeJson(JSONObject i1) {
        this.i1 = i1;
    }
    public String getJSON() {
        return i1.toString();
    }
}

ポイント:グローバルコンテキストを使う理由

この実装では、init(getApplicationContext()) で渡されたアプリケーションコンテキストをシングルトン内部に保持しています。Activityのコンテキストを直接保持すると、画面遷移後に古いActivityへの参照が残りメモリリークの原因になりますが、Applicationコンテキストであればアプリのライフサイクル全体で安全に利用できるのが大きな利点です。

  • getInstance() … 唯一のインスタンスを返す静的メソッド(synchronized でスレッドセーフに)
  • init(Context) … 初回のみグローバルコンテキストをセット
  • storeJson() / getJSON() … JSONオブジェクトの保存と文字列としての取得

アプリを実行して動作を確認する

それでは実際にアプリを動かしてみましょう。実機のAndroidスマートフォンがPCに接続されているものとします。Android Studioでプロジェクト内のアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックします。デバイス選択ダイアログで自分のモバイル端末を選ぶと、端末に次のような初期画面が表示されます。

Androidでグローバルコンテキストを使ってJSONオブジェクトをシングルトンとして保存する方法

次に、画面上のボタンをタップしてください。グローバルコンテキスト経由で保存したJSONオブジェクトが、Toastとして次のように表示されます。

Androidでグローバルコンテキストを使ってJSONオブジェクトをシングルトンとして保存する方法

これで、シングルトンにJSONオブジェクトを保存し、どこからでも同じインスタンス経由で参照できることが確認できました。設定値やキャッシュなど、アプリ全体で共有したいデータの管理にぜひ活用してください。

  1. Androidでグローバル変数を宣言する方法!シングルトンクラスを使った実装手順を徹底解説

    このチュートリアルでは、Androidアプリでグローバル変数のように使えるデータを宣言し、アプリ全体で共有する方法を解説します。具体的にはシングルトンクラスを作成し、どの画面からでも同じデータを保存・取得できるようにしていきます。 Androidでグローバル変数が必要になるケース Androidでは各Activityが独立したライフサイクルを持つため、通常のプログラミング言語のように単純にグローバル変数を宣言することは推奨されません。そこで定番となるのが、インスタンスがアプリ内に1つだけしか存在しないことを保証する「シングルトンパターン」です。これにより、画面をまたいで安全にデータを共有できま

  2. AndroidでJSON配列を反復処理する方法をステップごとに解説

    この記事では、Androidアプリ開発においてJSON配列(JSONArray)を反復処理する方法を、実際のサンプルコードとともにステップ形式で解説します。org.jsonパッケージのJSONObjectとJSONArrayクラスを使用して、JSON文字列からデータを取り出し、画面に表示するまでの一連の流れを学べます。完成イメージ本チュートリアルでは、従業員情報(ID・名前・給与)を含むJSON文字列を解析し、各要素を順番に読み取ってTextViewに表示するシンプルなアプリを作成します。手順1:Android Studioで新規プロジェクトを作成するまず、Android Studioを起動し