Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mvvm Reactivex NetworkMainThreadException,即使在订阅时也是如此_Mvvm_Kotlin_Rx Java2_Reactivex - Fatal编程技术网

Mvvm Reactivex NetworkMainThreadException,即使在订阅时也是如此

Mvvm Reactivex NetworkMainThreadException,即使在订阅时也是如此,mvvm,kotlin,rx-java2,reactivex,Mvvm,Kotlin,Rx Java2,Reactivex,我正在尝试构建一个MVVM Kotlin应用程序,它使用Reactivex对API进行异步调用 我见过很多线程都有相同的问题,但在所有线程上,OP都忘记在调用中放入subscribeOn,在我的代码中,我这样做了,但仍然存在网络错误。我在调试器中查找了问题,但没有成功 class NoteViewModel(apiKey : String) : ViewModel () { // , Observable { private lateinit var noteAdapter : NoteAdap

我正在尝试构建一个MVVM Kotlin应用程序,它使用Reactivex对API进行异步调用

我见过很多线程都有相同的问题,但在所有线程上,OP都忘记在调用中放入
subscribeOn
,在我的代码中,我这样做了,但仍然存在网络错误。我在调试器中查找了问题,但没有成功

class NoteViewModel(apiKey : String) : ViewModel () { // , Observable {
private lateinit var noteAdapter : NoteAdapter

private val notesList = MutableLiveData <ArrayList<Note>>()
private var subscription : Disposable
private val noteCollector = NoteCollector()
private val isLoading = MutableLiveData<Boolean>()

init {
    subscription = noteCollector.getAll(apiKey)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnSubscribe { onCollectNotesStart() }
            .doOnTerminate { onCollectNotesFinished() }
            .subscribe(
                    { result -> onCollectNotesSuccess(result) },
                    { error -> onCollectNotesError(error) }
            )
}
...
}
class-NoteViewModel(apiKey:String):ViewModel(){//,可观察{
私有lateinit变量noteAdapter:noteAdapter
private val notesList=MutableLiveData()
私人var订阅:一次性
private val noteCollector=noteCollector()
private val isLoading=MutableLiveData()
初始化{
subscription=noteCollector.getAll(apiKey)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe{onCollectNotesStart()}
.doInterminate{onCollectNotesFinished()}
.订阅(
{result->onCollectNotesAccess(结果)},
{error->onCollectNotesError(错误)}
)
}
...
}
如果你需要更多的信息,让我知道,我会提供它

编辑:添加stacktrace

E/AndroidRuntime: FATAL EXCEPTION: main
Process: jari.student.hogent.cominghome, PID: 2532
java.lang.RuntimeException: Unable to start activity ComponentInfo{jari.student.hogent.cominghome/jari.student.hogent.cominghome.Activities.MainActivity}: android.os.NetworkOnMainThreadException
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2955)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3030)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6938)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
 Caused by: android.os.NetworkOnMainThreadException
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1448)
    at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:102)
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:90)
    at java.net.InetAddress.getAllByName(InetAddress.java:787)
    at com.android.okhttp.Dns$1.lookup(Dns.java:39)
    at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:200)
    at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:148)
    at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:90)
    at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:190)
    at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:142)
    at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:104)
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:410)
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:343)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:489)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:131)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:262)
    at com.github.kittinunf.fuel.toolbox.HttpClient.setBodyIfDoOutput(HttpClient.kt:91)
    at com.github.kittinunf.fuel.toolbox.HttpClient.executeRequest(HttpClient.kt:39)
    at com.github.kittinunf.fuel.core.requests.TaskRequest.call(TaskRequest.kt:14)
    at com.github.kittinunf.fuel.core.DeserializableKt$response$result$1.invoke(Deserializable.kt:81)
    at com.github.kittinunf.fuel.core.DeserializableKt$response$result$1.invoke(Unknown Source:0)
    at com.github.kittinunf.result.Result$Companion.of(Result.kt:116)
    at com.github.kittinunf.fuel.core.DeserializableKt.response(Deserializable.kt:81)
    at com.github.kittinunf.fuel.core.Request.responseObject(Request.kt:344)
    at jari.student.hogent.cominghome.Models.NoteCollector.getAll(NoteCollector.kt:22)
    at jari.student.hogent.cominghome.ViewModels.NoteViewModel.<init>(NoteViewModel.kt:22)
    at jari.student.hogent.cominghome.ViewModels.CustomViewModelFactory.create(CustomViewModelFactory.kt:11)
    at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134)
    at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102)
    at jari.student.hogent.cominghome.Fragments.NoteFragment.onCreateView(NoteFragment.kt:27)
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:2439)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
    at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
    at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:802)
    at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
    at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
    at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3273)
    at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3229)
    at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:201)
    at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:620)
    at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:178)
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1340)
    at android.app.Activity.performStart(Activity.java:7200)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2918)
        ... 9 more
E/AndroidRuntime:致命异常:主
流程:jari.student.hogent.cominghome,PID:2532
java.lang.RuntimeException:无法启动活动组件信息{jari.student.hogent.cominghome/jari.student.hogent.cominghome.Activities.MainActivity}:android.os.NetworkOnMainThreadException
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2955)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3030)
位于android.app.ActivityThread.-wrap11(未知来源:0)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
位于android.os.Handler.dispatchMessage(Handler.java:105)
位于android.os.Looper.loop(Looper.java:164)
位于android.app.ActivityThread.main(ActivityThread.java:6938)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.Zygote$MethodAndArgsCaller.run上(Zygote.java:327)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
原因:android.os.NetworkOnMainThreadException
在android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1448)
位于java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:102)
在java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:90)
位于java.net.InetAddress.getAllByName(InetAddress.java:787)
位于com.android.okhttp.Dns$1.lookup(Dns.java:39)
位于com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:200)
在com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:148)
在com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:90)上
位于com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:190)
位于com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:142)
位于com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:104)
位于com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:410)
位于com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:343)
位于com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:489)
位于com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:131)
位于com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:262)
位于com.github.kittinunf.fuel.toolbox.HttpClient.setBodyIfDoOutput(HttpClient.kt:91)
位于com.github.kittinunf.fuel.toolbox.HttpClient.executeRequest(HttpClient.kt:39)
访问com.github.kittinunf.fuel.core.requests.TaskRequest.call(TaskRequest.kt:14)
位于com.github.kittinunf.fuel.core.DeserializableKt$response$result$1.invoke(Deserializable.kt:81)
位于com.github.kittinunf.fuel.core.DeserializableKt$response$result$1.invoke(未知源:0)
位于com.github.kittinunf.result.result$Companion.of(result.kt:116)
在com.github.kittinunf.fuel.core.DeserializableKt.response(Deserializable.kt:81)上
位于com.github.kittinunf.fuel.core.Request.responseObject(Request.kt:344)
在jari.student.hogent.cominghome.Models.NoteCollector.getAll(NoteCollector.kt:22)
在jari.student.hogent.cominghome.ViewModels.NoteViewModel.(NoteViewModel.kt:22)
在jari.student.hogent.cominghome.ViewModels.CustomViewModelFactory.create(CustomViewModelFactory.kt:11)
位于android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134)
位于android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102)
在jari.student.hogent.cominghome.Fragments.NoteFragment.onCreateView(NoteFragment.kt:27)
位于android.support.v4.app.Fragment.performCreateView(Fragment.java:2439)
位于android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
在android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
位于android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
位于android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:802)
位于android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
E/AndroidRuntime:at-android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
在android.support.v4.app.FragmentManagerImpl.removedandtoperationsandexecute(FragmentManager.java:2366)
位于android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
位于android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3273)
位于android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3229)
位于android.support.v4.app.FragmentController.dispatchActivit
override fun getAll(ApiKey: String): Observable<ArrayList<Note>> {
    val bodyJson: JSONObject = JSONObject()
            .put("apiKey", ApiKey)

    val notesList: ArrayList<Note> = ArrayList()

    val (_, _, result) = path.httpPost()
            .header(mapOf("Content-Type" to "application/json"))
            .body(bodyJson.toString())
            .responseObject(Note.Deserializer())
    val (notes, err) = result
    if (err != null){
        throw err.exception
    }
    notes?.forEach { note ->
        notesList.add(note)
    }

    return Observable.fromArray(notesList)
}
override fun getAll(ApiKey: String): Observable<ArrayList<Note>> 
    = Observable.create { emitter -> 
        val bodyJson: JSONObject = JSONObject()
                .put("apiKey", ApiKey)

        val notesList: ArrayList<Note> = ArrayList()

        val (_, _, result) = path.httpPost()
                .header(mapOf("Content-Type" to "application/json"))
                .body(bodyJson.toString())
                .responseObject(Note.Deserializer())
        val (notes, err) = result
        if (err != null) {
            throw err.exception
        }
        notes?.forEach { note ->
            notesList.add(note)
        }
        emitter.onNext(notesList)
    }