鍍金池/ 問答/Java  Android  網(wǎng)絡(luò)安全/ 怎么解決RxJava被訂閱內(nèi)容再次異步造成的內(nèi)存泄漏?

怎么解決RxJava被訂閱內(nèi)容再次異步造成的內(nèi)存泄漏?

因為被訂閱的內(nèi)容必須在新線程執(zhí)行,剛開始以為需要wait一下以免內(nèi)存泄漏,但加上后內(nèi)存依然泄漏

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未被回收

回答
編輯回答
晚風(fēng)眠

不是太清除kolin的寫法,不過內(nèi)存泄不泄露取決于你的訂閱是否取消訂閱,一般只要不再使用后取消訂閱不會出現(xiàn)內(nèi)存泄漏。

2017年6月17日 16:23