Reputation: 1507
Just getting started with trying to "Rx-ify" some of Android's Webview events.
class PageStartData(val url: String, val favicon: Bitmap?)
myWebview.webViewClient = object: WebViewClient() {
val pageStartEvents: Observable<PageStartData> = Observable.create{ emitter->
override fun onPageStarted(view: WebView, url: String, favicon: Bitmap){
emitter.onNext(PageStartData(url, favicon))
}
}
}
And I have found that the onPageStarted function is out of scope in the emitter lambda function. Very simple, I'm sure. How to fix?
All help appreciated.
Upvotes: 0
Views: 625
Reputation: 2672
Check this:
sealed class WebViewEvent {
data class PageStartData(val url: String?,
val favicon: Bitmap?) : WebViewEvent()
}
...
class RxWebViewWrapper(private val webView: WebView) : ObservableOnSubscribe<WebViewEvent> {
override fun subscribe(emitter: ObservableEmitter<WebViewEvent>) {
webView.webViewClient = object :WebViewClient(){
override fun onPageStarted(view: WebView?,
url: String?,
favicon: Bitmap?) {
super.onPageStarted(view, url, favicon)
emitter.onNext(WebViewEvent.PageStartData(url, favicon))
}
}
}
}
...
val source = Observable.create<WebViewEvent>(RxWebViewWrapper(myWebview))
Upvotes: 3
Reputation: 8442
It can be done via PublishSubject
myWebview.webViewClient = object : WebViewClient() {
private val pageStartSubject = PublishSubject.create<PageStartData>()
val pageStartEvents: Observable<PageStartData> = pageStartSubject
override fun onPageStarted(view: WebView, url: String, favicon: Bitmap) {
pageStartSubject.onNext(PageStartData(url, favicon))
}
}
Upvotes: 1