«NetworkOnMainThreadException» в приложении Kollin для Android, которое использует файл kotlin-Генерируемый-клиент, сгенерированный swagger - PullRequest
0 голосов
/ 21 июня 2019

Я новичок в Kotlin, я хочу создать мобильное приложение для Android. Я использую Android studio 3.3, уровень API Android 28. Я использовал сваггер, чтобы получить весь свой веб-сервис RESTful, поэтому у меня есть android-client-генерируется файл, который содержит все веб-службы.Для начала я создал интерфейс Android для аутентификации по электронной почте и паролю ». Среди доступных веб-сервисов« apiMobileUsersGetByFireBaseIDGet ». В этом Ws для идентификации используется идентификатор firebase.
Я создаю класс kotlin AUthentication, как показано ниже:

class Authentication : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_authentication)
        var email = editTextEmail.text
        var password = editTextPassword.text

        FirebaseApp.initializeApp(this@Authentication)
        val auth = FirebaseAuth.getInstance()

        buttonlogin.setOnClickListener {
            auth.signInWithEmailAndPassword(email.toString(), password.toString())
                .addOnCompleteListener(this) { task ->
                    if (task.isSuccessful) {
                        println("success")
                        if (verifyAvailableNetwork(this@Authentication)) {
                            try {
                                CoroutineScope(Dispatchers.Main).launch {
                                    val user = MobileApi().apiMobileUsersGetByFireBaseIDGet(auth.currentUser!!.uid)
                                    if (user == UsersData()) {
                                        var intent = Intent(this@Authentication, MainActivity::class.java)
                                        intent.putExtra("id", auth.currentUser?.email)
                                        startActivity(intent)
                                    }
                                }

                            } catch (e: ClientException) {
                                println("4xx response calling apiMobileUsersGetByFireBaseIDGet")
                                e.printStackTrace()
                            } catch (e: ServerException) {
                                println("5xx response calling apiMobileUsersGetByFireBaseIDGet ")
                                e.printStackTrace()
                            }
                        }
                    } else {
                        println("Error: ${task.exception?.message}")
                    }
                }


        }

    }

}

я добавил разрешение на доступ к Интернету в AndroidManifest.xml. Моя проблема в том, что когда я запускаю свое приложение на своем мобильном телефоне, возникает NetworkOnMainThreadException. Я несколько раз пытался исправить эту ошибкуЯ действительно застрял. Описание ошибки следующим образом:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.app.homecraft, PID: 32245
    android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1285)
        at java.net.InetAddress.lookupHostByName(InetAddress.java:434)
        at java.net.InetAddress.getAllByNameImpl(InetAddress.java:255)
        at java.net.InetAddress.getAllByName(InetAddress.java:218)
        at okhttp3.Dns$Companion$SYSTEM$1.lookup(Dns.kt:48)
        at okhttp3.internal.connection.RouteSelector.resetNextInetSocketAddress(RouteSelector.kt:157)
        at okhttp3.internal.connection.RouteSelector.nextProxy(RouteSelector.kt:122)
        at okhttp3.internal.connection.RouteSelector.next(RouteSelector.kt:70)
        at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:203)
        at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:108)
        at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:76)
        at okhttp3.internal.connection.Transmitter.newExchange$okhttp(Transmitter.kt:162)
        at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:36)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:117)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:90)
        at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:84)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:117)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:90)
        at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:84)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:117)
        at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:71)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:117)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:90)
        at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.kt:184)
        at okhttp3.RealCall.execute(RealCall.kt:67)
        at io.swagger.client.apis.MobileApi.apiMobileUsersGetByFireBaseIDGet(MobileApi.kt:4096)
        at com.app.homecraft.Authentication$onCreate$1$1$1.invokeSuspend(Authentication.kt:38)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:233)
        at android.os.Handler.handleCallback(Handler.java:743)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:150)
        at android.app.ActivityThread.main(ActivityThread.java:5639)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:689)

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Ваша ошибка говорит о том, что вы выполняете некоторую тяжелую работу над пользовательским интерфейсом, которая может привести к некоторому замораживанию или, что еще хуже.Сбои.В этом случае вам следует переместить ваш вызов в фоновый поток, что означает, что пользовательский интерфейс будет продолжать работать в обычном режиме, пока сетевой запрос будет выполняться независимо от пользовательского интерфейса.Поскольку вы используете Kotlin coroutines, вы можете изменить Dispatchers.Main на Dispatchers.IO. Это простой пример.

0 голосов
/ 21 июня 2019

вы должны отправлять запросы в сеть только в фоновом потоке, в противном случае вы получите сообщение об ошибке при попытке сделать запрос

...