io.reactivex-> android.os.NetworkOnMainThreadException

问题描述 投票:0回答:1

Android Studio 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)
android kotlin reactivex
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.