「アンドロイド」Shared Preferencesとマークし、短い情報を保存


1.緒論


サーバにログイン要求を送信すると、次のトークン情報が応答として受信されます.ログイン後,ユーザがアクセスする情報はヘッダにAccessTokenを付けて要求する.そのため、必要に応じてリポジトリに格納される可能性があります.
{
  "accessToken": "string",
  "accessTokenExpireDate": 0,
  "grantType": "string",
  "refreshToken": "string"
}
ローカルストレージにデータを格納するには、2つの選択肢があります.ROMまたはShared Preferencesが見つかりました
ROOM持続ライブラリは、DBクラス、DBテーブル、DAOを作成した後、DBインスタンス+使用方法を作成する方法です.
Shared Preferencesは、キー値、メソッド(制御スライダの読み取り、書き込み、取得)を使用して、アクティブなデバイスからアクセスできるオブジェクト形式です.
3 Stringと1 Intは簡単な情報なのでSharedPreferencesを使うことにしました.

2.本題


1.実施特徴


1.単一トーンモードを使用すると、グローバルアクセスが可能になります。


ログイン後はAccessTokenを受信して持ち歩く必要があります.コメントリクエストやユーザー&注目ポイントクエリーに使用することを考慮します!
モノトーンのメリットとデメリットは以下の通りです.
<メリット>
1.オブジェクトを一度に作成して複数のクラスを共有する->メモリの浪費を回避し、他のオブジェクトと共有する
2.2回目の呼び出しから、オブジェクトのロード時間の短縮->パフォーマンスの向上
<短所>
1.悪用の場合、GC(Garbage Collector)でリソースを回収できない->メモリリソースの削減
2.単一色調のクラスにデータを入れすぎて複数のクラスが共有されている場合->マージも増加します
Shared Preferencesはメモリリソースを浪費する可能性があり、いくら簡単な情報でもグローバルな範囲ではあまり使用されない可能性があります.しかし、AccessTokenは、ほとんどのAPI呼び出しに使用されると予想されるため、このモードを共有クラスとして使用することができる.

2.アプリケーション共有クラスを作成します。


アクティブデバイスがShared Preferencesオブジェクトを使用してデータを格納する必要がある場合は、AライフサイクルのonCreate()の前に初期化する必要があります.したがって、SharedPreferences領域変数を持つTokenSharedPreferencesクラスは、まず共有クラスのグローバル変数Appとして初期化される.

グーグルで遊んだ時どこで見たか覚えてないけど….明らかに、Bという名前のクラスでは、SharedPreferencesを領域変数に設定し、Bを共有クラスに登録するコードがあります.単純なグローバルオブジェクトや変数ではなくShared Preferencesを持つ特別な方法
私のプロジェクトを例にとると、共有クラスアプリケーションはグローバルリソースの空間であり、トークン情報のみが登録されています.ただし、後でログインするかどうかなど、簡単な設定値が加わる場合があります.Appは、Appサブアイテムから直接データ値にアクセスするよりも、token_prefs.accessToken, App.login_prefs.login, App.setting.languageのように具体化されたクラスや地域変数は、エラーを減らす可能性があります.(いいえ...ははは)
App.kt
package com.example.bangu

import android.app.Application
import com.example.bangu.login.data.TokenSharedPreferences

class App:Application() {
    companion object{
        lateinit var token_prefs : TokenSharedPreferences
    }

    override fun onCreate() {
        token_prefs = TokenSharedPreferences(applicationContext)
        super.onCreate()
    }
}
SharedPreferencesオブジェクトが提供するputInt()やputString()などはset()に統一され、getInt()やgetString()などはget()に統一される.
次に、SharedPreferencesオブジェクトが提供する書き込み方法を使用し、変更をapply()またはcommit()メソッドに保存する必要があります.
apply()は、メモリ内のShared Preferencesオブジェクトをすぐに変更しますが、非同期書き込みディスクが更新されます.commit()を使用して、データをディスクに同期して書き込むこともできます.ただし、commit()は同期化されているので、プライマリスレッドでの呼び出しは避けてください.UIレンダリングは一時停止する場合があります.
トークン情報の格納は同期されているため,あまりメリットがないようでapply()を用いた.
TokenSharedPreferences.kt
class TokenSharedPreferences(context: Context) {
    private val prefsFilename = "token_prefs"
    private val key_accessToken = "accessToken"
    private val key_accessTokenExpireDate = "accessTokenExpireDate"
    private val key_grantType = "grantType"
    private val key_refreshToken = "refreshToken"
    private val prefs:SharedPreferences = context.getSharedPreferences(prefsFilename,0)

    var accessToken: String?
        get() = prefs.getString(key_accessToken,"")
        set(value) = prefs.edit().putString(key_accessToken,value).apply()
    var accessTokenExpireDate:Int
        get() = prefs.getInt(key_accessTokenExpireDate,0)
        set(value) = prefs.edit().putInt(key_accessTokenExpireDate,value).apply()
    var grantType:String?
        get() = prefs.getString(key_grantType,"")
        set(value) = prefs.edit().putString(key_grantType,value).apply()
    var refreshToken: String?
        get() = prefs.getString(key_refreshToken,"")
        set(value) = prefs.edit().putString(key_refreshToken,value).apply()
}

3.結論


最初はMVVM哲学(?)必要に応じて機能を実現する方法が分かりません.しかし今回はローカルデータストレージに関係しているのか、パズルを見つけやすいように感じたので、そんなに挿入しにくいさわやかさがありました.

参考資料
共有クラスに関連
https://uroa.tistory.com/43
モノトーンモード相関
https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/
sharedPreferencesに関連
https://koohee.tistory.com/12
https://developer.android.com/training/data-storage/shared-preferences?hl=ko