如何以及在何处声明用于保存数据的全局变量



我正在尝试构建我的第一个Kotlin应用程序,在那里我保存了我的私人小时应急。例如,如果我学习2小时,我会加上2小时。如果我玩电子游戏30分钟,我会减去2小时,这样我每学习一小时就可以玩15分钟的电子游戏。我正在用sharedPreferences保存我的数据,我从我的TextView中获取这些数据。当我启动应用程序时,我只是将数据加载到我的TextView中。因此,在运行应用程序时,TextView可以节省我已经获得的小时和分钟:

//Saves the TextView from the Main Activity (Probably bad practice but its my first Kotlin APP and i will improve later)
private fun saveData(){
val hcString = findViewById(R.id.hourly_contingent) as TextView
val hcStrArr = hcString.text.split(":").toTypedArray()
val hcIntArr = arrayOf(hcStrArr[0].toInt(), hcStrArr[1].toInt())
val sharedPreferences = getSharedPreferences("hourly_contingent", Context.MODE_PRIVATE);
val editor = sharedPreferences.edit();
editor.apply(){
putInt("hc_hours", hcIntArr[0])
putInt("hc_minutes", hcIntArr[1])
}.apply()
Toast.makeText(this, "Data saved", Toast.LENGTH_SHORT).show()
}
//Puts the saved Data to the hourly_contingent String
private fun loadData(){
val sharedPreferences = getSharedPreferences("hourly_contingent", Context.MODE_PRIVATE);
val hcHours = sharedPreferences.getInt("hc_hours", 0)
val hcMinutes = sharedPreferences.getInt("hc_minutes", 0)
val hourly_contingent = findViewById(R.id.hourly_contingent) as TextView
val hcString = hcHours.toString() + ":" + hcMinutes.toString()
hourly_contingent.text = hcString
}

我知道这是很糟糕的做法,但我不知道如何做得更好。我应该使用全局变量吗?我在哪里以及如何申报?我是否应该创建一个新的文件MyApplication.kt,并在其中创建一个这样的全局类:

public class Global : Application() {
open var homeAPIResponse: String = "defaultValue"
}

一点帮助真的很好!

我建议您的第一件事是阅读android的基本设计模式。模型视图控制器和模型视图视图模型。它们确实可以帮助您解决数据范围问题,并展示在android上显示数据的良好实践。(https://developer.android.com/jetpack/guide)

udacity上有很多令人惊叹的android基础课程,由android开发人员制作,所有课程都是免费的。他们肯定会澄清你在这里描述的大多数问题。应该如何存储数据,或者应该如何准备数据以供用户显示。

因此,为了以某种方式回答您的问题:现在您的代码段是从MainActivity调用的。活动销毁后,Activity类中的所有可变值存储都将消失。它源于一项活动的生命周期(另一个值得阅读的好话题(。要持久保存一些数据,即使在应用程序关闭(即活动被破坏(后,您也可以使用SharedPreferences(非常适合小数据,更适合与UI配置相关的数据(、文件存储或数据库。最后一个通过Room库非常容易,但对于存储一个浮点值来说可能有些过头了。我希望这能回答你的问题。正在读取链接-关于数据持久性:(https://developer.android.com/training/data-storage)

最新更新