代码
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
startActivity(Intent(this, SecondActivity::class.java))
}
}
}
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
fetchData()
}
private fun fetchData() {
// 模拟网络耗时操作
Observable.interval(1, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
textView.text = it.toString()
}
}
}
操作
点击按钮跳转到 SecondActivity,按 back 返回,再次点击按钮跳转,再按 back 返回。
查看内存情况
点击 Profiler ,添加应用所在进程,选 Memory,先点几次 Force garbage collection,然后点击 Dump Java heap。
选择 Arrange by package,方便查找,可以发现内存中有两个 SecondActivity 和两个 SecondActivity$fetchData$1。
已经用不到 SecondActivity 了,这无疑是内存泄漏。
用 Disposable 避免内存泄漏
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
fetchData()
}
private lateinit var disposable: Disposable
private fun fetchData() {
disposable = Observable.interval(1, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
textView.text = it.toString()
}
}
override fun onDestroy() {
disposable.dispose()
super.onDestroy()
}
}
网友评论