首页 > 解决方案 > 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)

标签: androidkotlinreactivex

解决方案


您的 observable 应该在后台线程上订阅以进行网络调用。在 RxJava 中,您可以使用subscribeOn(Schedulers.io()). 这意味着您的 observable 将在 io 调度程序上订阅。io schedulers 通常在进行网络调用操作时使用


推荐阅读