android - io.reactivex -> android.os.NetworkOnMainThreadException
问题描述
安卓工作室 3.6
在我的活动中:
private fun update(force: Boolean = false) {
if (!force) {
)
} else {
kycStateRepository.update()
}
repositoryProvider.account().update()
}
open fun updateIfNotFresh(): Completable {
return synchronized(this) {
if (!isFresh) {
update()
} else {
Completable.complete()
}
}
}
import io.reactivex.Completable
import io.reactivex.Observable
import io.reactivex.disposables.Disposable
import io.reactivex.rxkotlin.subscribeBy
import io.reactivex.subjects.CompletableSubject
override fun update(): Completable {
if (BuildConfig.DEBUG)
Log.d(TAG, "update:")
invalidate()
return synchronized(this) {
val resultSubject = updateResultSubject.let {
if (it == null) {
val new = CompletableSubject.create()
updateResultSubject = new
new
} else {
it
}
}
item = null
isLoading = true
val storedItemObservable =
if (isNeverUpdated) getStoredItemObervable() else Observable.empty()
updateDisposable?.dispose()
updateDisposable = storedItemObservable.concatWith(
getItem()
.map {
storeItem(it)
it
}
)
.subscribeBy(
onNext = { newItem: T ->
onNewItem(newItem)
},
onComplete = {
isLoading = false
updateResultSubject = null
resultSubject.onComplete()
},
onError = {
isLoading = false
errorsSubject.onNext(it)
updateResultSubject = null
resultSubject.onError(it)
}
)
resultSubject
}
}
但我在这一行得到错误:
.subscribeBy(
这里的错误详情:
android.os.NetworkOnMainThreadException
05-09 22:53:13.639 D/gralloc_ranchu( 1768): gralloc_alloc: Creating ashmem region of size 17051648
05-09 22:53:13.639 D/EGL_emulation(12006): eglMakeCurrent: 0xdbb1a4e0: ver 2 0 (tinfo 0xdbb0f5f0)
05-09 22:53:13.656 D/OkHttp (12006): <-- 200 OK http://some_url/GCRP32XEJFAA2DRABFWYRH5?include=external_system_ids,kyc_data (112ms)
05-09 22:53:13.656 D/OkHttp (12006): Server: nginx/1.17.10
05-09 22:53:13.656 D/OkHttp (12006): Date: Sat, 09 May 2020 19:53:13 GMT
05-09 22:53:13.656 D/OkHttp (12006): Content-Type: application/vnd.api+json
05-09 22:53:13.656 D/OkHttp (12006): Content-Length: 1791
05-09 22:53:13.656 D/OkHttp (12006): Connection: keep-alive
05-09 22:53:13.656 D/OkHttp (12006): X-Upstream: 9e4cd27d2457
05-09 22:53:13.656 D/OkHttp (12006): Access-Control-Allow-Methods: GET, POST, PUT, PATCH, OPTIONS, DELETE
05-09 22:53:13.656 D/OkHttp (12006): Access-Control-Allow-Headers: DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Signature
05-09 22:53:13.656 D/OkHttp (12006): Access-Control-Allow-Credentials: true
05-09 22:53:13.656 D/OkHttp (12006): Access-Control-Expose-Headers: Content-Length,Content-Range
05-09 22:53:13.656 D/OkHttp (12006): {"data":{"id":"GCRP32XK4BLBRO3OLLRLWC2Z46RAEANUWU5BCGWNEJFAA2DRAid":"YGDMSPDXABBKH4VNN7ZSHBM5DMVL2OTU3NWG2C3ZE5IQVIWUSEWQ"}}}]}
05-09 22:53:13.657 D/OkHttp (12006): <-- END HTTP (1791-byte body)
05-09 22:53:13.684 D/EGL_emulation(12006): eglMakeCurrent: 0xdbb1a4e0: ver 2 0 (tinfo 0xdbb0f5f0)
05-09 22:53:13.687 W/System.err(12006): android.os.NetworkOnMainThreadException
05-09 22:53:13.688 W/InputReader( 2026): Device has associated, but no associated display id.
05-09 22:53:13.688 W/System.err(12006): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1565)
05-09 22:53:13.688 W/InputReader( 2026): Device has associated, but no associated display id.
05-09 22:53:13.688 I/chatty ( 2026): uid=1000(system) android.anim identical 7 lines
05-09 22:53:13.688 W/InputReader( 2026): Device has associated, but no associated display id.
05-09 22:53:13.688 W/System.err(12006): at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:389)
05-09 22:53:13.688 W/System.err(12006): at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
05-09 22:53:13.688 W/System.err(12006): at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
05-09 22:53:13.688 W/System.err(12006): at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
05-09 22:53:13.688 W/System.err(12006): at java.net.Socket.connect(Socket.java:621)
05-09 22:53:13.688 W/System.err(12006): at okhttp3.internal.platform.AndroidPlatform.connectSocket(AndroidPlatform.java:69)
05-09 22:53:13.688 W/System.err(12006): at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:238)
05-09 22:53:13.688 W/System.err(12006): at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:158)
05-09 22:53:13.688 W/System.err(12006): at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:256)
05-09 22:53:13.688 W/System.err(12006): at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:134)
05-09 22:53:13.688 W/System.err(12006): at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:113)
05-09 22:53:13.688 W/System.err(12006): at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
05-09 22:53:13.688 W/System.err(12006): at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
05-09 22:53:13.688 W/System.err(12006): at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
05-09 22:53:13.688 W/System.err(12006): at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
05-09 22:53:13.688 W/System.err(12006): at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
05-09 22:53:13.688 W/System.err(12006): at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
05-09 22:53:13.688 W/System.err(12006): at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
05-09 22:53:13.688 W/System.err(12006): at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
05-09 22:53:13.688 W/System.err(12006): at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:125)
05-09 22:53:13.688 W/System.err(12006): at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
05-09 22:53:13.688 W/System.err(12006): at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
05-09 22:53:13.688 W/System.err(12006): at org.tokend.sdk.tfa.TfaInterceptor.intercept(TfaInterceptor.kt:19)
解决方案
您的 observable 应该在后台线程上订阅以进行网络调用。在 RxJava 中,您可以使用subscribeOn(Schedulers.io())
. 这意味着您的 observable 将在 io 调度程序上订阅。io schedulers 通常在进行网络调用操作时使用
推荐阅读
- swift - SwiftUI NavigationView 试图弹出到丢失的目的地(Monoceros?)
- java - 从android中的json数组中删除重复值
- bash - Linux 创建别名模式(别名系列)或具有类似效果的东西
- switch-statement - NetSuite 已保存搜索 - 2 个位置之间的可用库存比较
- python - 如何解析嵌套的 JSON?
- postgresql - still located to default data directory postgreSQL even i've changed
- javascript - how to create multtple image auto silder use amp in html
- javascript - Why can't the dispatch function of a useState hook be passed directly into an onClick handler?
- google-cloud-platform - How to resolve Waiting to reconcile Route. Resource readiness deadline exceeded
- loops - How do I create array of classes in LESS with @loop