

# 概要

kotlinを使用してAndroidアプリを開発しています。  
開発しているアプリはニュースアプリのようなもので、クリップというお気に入り保存機能があります。  
アプリ起動時にDBに保存されているクリップ一覧を取得し、lateinitのグローバル変数に保持していますが、一部のユーザーでlateinitがイニシャライズされていないというクラッシュが発生しています。

[code]

    Unable to start activity ComponentInfo{xxx.xxx.xxx/xxx.xxx.xxx.activity.XXXActivity}: kotlin.UninitializedPropertyAccessException: lateinit property clipList has not been initialized
    
[/code]

`clipList`はアプリ起動時に取得し、確実に取得しないとアプリを使用できないようにしてあるので、初期化漏れということはないはずです。  
メモリ超過によりグローバル変数を保持しているシングルトンクラスが破棄されてしまっているのだと考えています。

具体的な実装は下記に記しますが、applicationクラスを継承しているので破棄されないものと思っていましたが、こういったグローバル変数はどのように保持するのが正解なのでしょうか。

ご教示よろしくお願いいたします。

# 実装

**グローバル変数保持クラス**

[code]

    class MyApp: Application() {
    
        // クリップ記事リスト（ClipAdviceは自作モデル）
        lateinit var clipList: ArrayList<ClipAdvice>
    
        override fun onCreate() {
            super.onCreate()
        }
    
        companion object {
            val sharedInstance: MyApp by lazy {
                MyApp()
            }
        }
    }
    
[/code]

**グローバル変数にアクセスしているコード**

[code]

    MyApp.sharedInstance.clipList.add(0, clip)
    
[/code]


CC BY-SA 4.0
2020-06-23T06:30:35.430
67918
2020-07-09T15:50:35.340
2020-06-23T08:10:11.997
3060
15313
question
android kotlin
androidアプリにおけるlateinitのグローバル変数を保持する方法


androidにおいて、Applicationクラスに保持したデータは消えることがあります。  
詳細は以下解説している記事をご確認ください。  
<http://www.developerphil.com/dont-store-data-in-the-application-object/>

記事中でもある様に、Activity間でデータを保持する場合、いくつか方法があります。

  * Activity間でIntentを用いてデータをやり取りする 
    * これは環境にも依存しますが上限サイズが1MB程度が限度と言われています。
  * local database等を使用して永続化し、Activity毎に復元する
  * lateinitの代わりにnullで初期化しておき、常にnull checkを行う

古い記事なので言及されておりませんが、以下の様なInterfaceを使用することも出来ます。

  * Allicationスコープで ViewModelStoreOwnerを使用する


CC BY-SA 4.0
2020-07-09T15:50:35.340
68451
2020-07-09T15:50:35.340
39410
67918
answer