怎么解决RxJava被订阅内容再次异步造成的内存泄漏?

因为被订阅的内容必须在新线程执行,刚开始以为需要wait一下以免内存泄漏,但加上后内存依然泄漏

fragment

class MemoryLeakFragment : Fragment() {

    lateinit var disposable: Disposable
    
    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)

        disposable = Observable.create<String> {

            val lock = Object()

            Thread {

                Thread.sleep(1000)

                it.onNext("")
                
                synchronized(lock) { lock.notify() }

            }.start()

            synchronized(lock) { lock.wait() }

            it.onComplete()

        }.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({
                    Toast.makeText(context, it, Toast.LENGTH_LONG).show()
                }, {
                    Toast.makeText(context, it.message, Toast.LENGTH_LONG).show()
                }, {
                    Toast.makeText(context, "end", Toast.LENGTH_LONG).show()
                })
    }
    override fun onDestroy() {
        if (!disposable.isDisposed)
            disposable.dispose()
        super.onDestroy()
    }
}

activity

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val button = AppCompatButton(this)
        button.setOnClickListener({
            supportFragmentManager.beginTransaction()
                    .replace(android.R.id.content, TestFragment())
                    .addToBackStack(null).commit()
        })
        setContentView(button)
    }

    override fun onBackPressed() {
        if (supportFragmentManager.backStackEntryCount == 0)
            Toast.makeText(this, "exit", Toast.LENGTH_SHORT).show()
        else super.onBackPressed()
    }
}

fragment未被回收

阅读 2.7k
1 个回答

不是太清除kolin的写法,不过内存泄不泄露取决于你的订阅是否取消订阅,一般只要不再使用后取消订阅不会出现内存泄漏。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题