Rxjava, combineLatest 与 RxTextView 内存泄漏
Rxjava, combineLatest with RxTextView memory leak
我正在尝试将 combineLatest 与多个 RxTextView 一起使用,我认为我正在正确处理我的 Disposables,但看起来我仍然存在内存泄漏。
val one = RxTextView.afterTextChangeEvents(one)
val two = RxTextView.afterTextChangeEvents(two)
val three = RxTextView.afterTextChangeEvents(three)
val four = RxTextView.afterTextChangeEvents(four)
val five = RxTextView.afterTextChangeEvents(five)
val disposable = Observables.combineLatest(one, two, three, four, five) { oneEvent, twoEvent, threeEvent, fourEvent, fiveEvent ->
//combining happening with these strings: oneEvent.view().text.toString }
.skip(1)
.debounce(1000, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
//network call
}
compositeDisposable.add(disposable)
}
然后在我的 onStop
中处理掉它。
override fun onStop() {
super.onStop()
if (!compositeDisposable.isDisposed) {
compositeDisposable.dispose()
}
}
我读到如果在 onNext() 方法中引用了某些视图,那么我认为可能会发生 NullPointerException。这是我得到的 NPE:
fatal Exception: java.lang.NullPointerException: view == null
at com.jakewharton.rxbinding2.internal.Preconditions.checkNotNull(Preconditions.java:27)
at com.jakewharton.rxbinding2.widget.RxTextView.afterTextChangeEvents(RxTextView.java:159)
at MyFragment$setUpTextListeners.execute(MyFragment.kt:170)
这是我正在使用的片段:
private lateinit var viewModel: MyViewModel
private lateinit var binding: FragmentMyThingsBinding
private val compositeDisposable = CompositeDisposable()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = FragmentMyThingsBinding.inflate(inflater, container, false)
viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
binding.viewModel = viewModel
//calls to kick off business logic
return binding.root
}
override fun onStart() {
super.onStart()
setUpTextListeners()
}
override fun onStop() {
super.onStop()
if (!compositeDisposable.isDisposed) {
compositeDisposable.dispose()
}
}
private fun setUpTextListeners() {
val one = RxTextView.afterTextChangeEvents(one)
val two = RxTextView.afterTextChangeEvents(two)
val three = RxTextView.afterTextChangeEvents(three)
val four = RxTextView.afterTextChangeEvents(four)
val five = RxTextView.afterTextChangeEvents(five)
compositeDisposable.add(Observables.combineLatest(one, two, three, four, five) { oneEvent, twoEvent, threeEvent, fourEvent, fiveEvent ->
//combine here using oneEvent.view().text.toString }
.skip(1)
.debounce(1000, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
//network call
})
}
}
您传递给 RxTextView.afterTextChangeEvents
的其中一个观点为空。有 assert in that function,它检查 null
上的传入参数。
而且这个问题与内存泄漏无关。
编辑:
将合成视图 属性 更改为使用 binding.editText
解决了这个问题。 (评论讨论)
我正在尝试将 combineLatest 与多个 RxTextView 一起使用,我认为我正在正确处理我的 Disposables,但看起来我仍然存在内存泄漏。
val one = RxTextView.afterTextChangeEvents(one)
val two = RxTextView.afterTextChangeEvents(two)
val three = RxTextView.afterTextChangeEvents(three)
val four = RxTextView.afterTextChangeEvents(four)
val five = RxTextView.afterTextChangeEvents(five)
val disposable = Observables.combineLatest(one, two, three, four, five) { oneEvent, twoEvent, threeEvent, fourEvent, fiveEvent ->
//combining happening with these strings: oneEvent.view().text.toString }
.skip(1)
.debounce(1000, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
//network call
}
compositeDisposable.add(disposable)
}
然后在我的 onStop
中处理掉它。
override fun onStop() {
super.onStop()
if (!compositeDisposable.isDisposed) {
compositeDisposable.dispose()
}
}
我读到如果在 onNext() 方法中引用了某些视图,那么我认为可能会发生 NullPointerException。这是我得到的 NPE:
fatal Exception: java.lang.NullPointerException: view == null
at com.jakewharton.rxbinding2.internal.Preconditions.checkNotNull(Preconditions.java:27)
at com.jakewharton.rxbinding2.widget.RxTextView.afterTextChangeEvents(RxTextView.java:159)
at MyFragment$setUpTextListeners.execute(MyFragment.kt:170)
这是我正在使用的片段:
private lateinit var viewModel: MyViewModel
private lateinit var binding: FragmentMyThingsBinding
private val compositeDisposable = CompositeDisposable()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = FragmentMyThingsBinding.inflate(inflater, container, false)
viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
binding.viewModel = viewModel
//calls to kick off business logic
return binding.root
}
override fun onStart() {
super.onStart()
setUpTextListeners()
}
override fun onStop() {
super.onStop()
if (!compositeDisposable.isDisposed) {
compositeDisposable.dispose()
}
}
private fun setUpTextListeners() {
val one = RxTextView.afterTextChangeEvents(one)
val two = RxTextView.afterTextChangeEvents(two)
val three = RxTextView.afterTextChangeEvents(three)
val four = RxTextView.afterTextChangeEvents(four)
val five = RxTextView.afterTextChangeEvents(five)
compositeDisposable.add(Observables.combineLatest(one, two, three, four, five) { oneEvent, twoEvent, threeEvent, fourEvent, fiveEvent ->
//combine here using oneEvent.view().text.toString }
.skip(1)
.debounce(1000, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
//network call
})
}
}
您传递给 RxTextView.afterTextChangeEvents
的其中一个观点为空。有 assert in that function,它检查 null
上的传入参数。
而且这个问题与内存泄漏无关。
编辑:
将合成视图 属性 更改为使用 binding.editText
解决了这个问题。 (评论讨论)