对于一个Android应用,我想延迟显示一些内容。因此,我正在使用处理程序。
private lateinit var mHandler: Handler
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
linearLayout.isVisible = false
mHandler = Handler()
mHandler.postDelayed({
linearLayout.isVisible = true
}, 1000)
}
如何保存此状态(例如在旋转应用程序的情况下)?并且最好使用SharedPreferences
或类似的东西:
override fun onSaveInstanceState(outState: Bundle?) {
super.onSaveInstanceState(outState)
}
override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
super.onRestoreInstanceState(savedInstanceState)
}
答案 0 :(得分:0)
我建议使用更新的ViewModel
组件来解决类似问题。 ViewModel
不会像活动和片段那样在配置更改时被破坏,因此您可以运行Handler
(或Timer
)而不必担心丢失其状态。
class MainViewModel : ViewModel() {
private val layoutVisibility: MutableLiveData<Boolean> by lazy {
MutableLiveData().also {
delayVisibility()
}
}
private fun delayVisibility() {
Timer().schedule(1000) {
layoutVisibility.postValue(true)
}
}
}
class MainActivity : AppCompatActivity() {
private lateinit var model: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
model = ViewModelProviders.of(this)[MainViewModel::class.java]
linearLayout.isVisible = false
model.layoutVisibility.observe(this, Observer<Boolean> { visibility ->
linearLayout.isVisible = visibility == true
})
}
}
您可以保存处理程序的状态,方法是保存开始时间并计算重新创建活动时经过的时间,但是ViewModel
体系结构对我来说似乎更直观
class MainActivity : AppCompatActivity() {
private lateinit var startTime: Long
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
linearLayout.isVisible = false
var elapsedTime: Long = 0L
if (savedInstanceState != null) {
startTime = savedInstanceState.getLong(KEY_START_TIME, System.currentTimeMillis())
elapsedTime = System.currentTimeMillis() - startTime
} else {
startTime = System.currentTimeMillis()
}
if (elapsedTime >= 1000) {
linearLayout.isVisible = true
} else {
Handler().postDelayed({
linearLayout.isVisible = true
}, 1000 - elapsedTime)
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putLong(KEY_START_TIME, startTime)
}
companion object {
private const val KEY_START_TIME = "start_time"
}
}