美文网首页
内存泄漏

内存泄漏

作者: ivotai | 来源:发表于2020-03-28 10:52 被阅读0次

代码

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()
    }

}

相关文章

网友评论

      本文标题:内存泄漏

      本文链接:https://www.haomeiwen.com/subject/jojjuhtx.html