假设我有以下课程:
class Activity1: Activity {
private var objects = arrayListOf<MyObject>()
override fun onCreate(...) {
...
Thread {
getThoseObjects() {
this.runOnUiThread {
objects = it
//load a fragment using objects
val fragment = MyFragment.newInstance(objects)
}
}
}.start()
}
fun startActivity2() {
val i = Activity2.newIntent(objects)
...
}
}
class Activity2: Activity {
private lateinit var objects: ArrayList<MyObject>
override onCreate(...) {
objects = intent.getSerializableExtra(MY_KEY) as ArrayList<MyObject>
}
}
这是在这两个类中声明/初始化对象数组列表的最佳实践吗?
在Activity1中,我需要从服务器中获取它,并在片段中使用它,还可以根据需要将其传递给Activity2。我不想将其设置为可为空,但是初始化空数组也很奇怪。
在Activity2中,lateinit var(根据我的发现)似乎是处理此问题的最佳方法。
对于getSerializableExtra强制转换中未经检查的强制转换,我相信我可以忽略该警告,但我希望它有人可以巧妙地避免它。
答案 0 :(得分:0)
您还可以在Activity1中将Lateinit var用于对象。
将对象发送到Activity2时,让Activity2处理onCreate方法中意图的空值
答案 1 :(得分:0)
您可以使用委托属性 lazy 进行初始化。
根据您的情况,您正在从API获取数据(这意味着将来),并且惰性块用于在调用访问时而不是在声明时进行val初始化。
因此对于Activity1,它就像:
private val objects by lazy { return@lazy arrayListOf<MyObject>()}
对于活动2:
private val objects: ArrayList<MyObject>? by lazy { return@lazy (intent?.getSerializableExtra(MY_KEY) as ArrayList<MyObject>) ?: null }
来自here的更多内容。
答案 2 :(得分:0)
根据您的体系结构,使用状态,视图模型或其他抽象创建一些共享的类/对象,例如presenter。它应该负责网络呼叫并在现场存储值。在第一个活动中请求加载数据。然后开始第二项活动,尝试访问存储(或不存储)值的字段。如果不为null,则显示您的数据;如果不等待数据完成,则使用某种观察者模式或其他方式通知您的活动。这是更干净的方法。