因为被订阅的内容必须在新线程执行,刚开始以为需要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()
}
}

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