http 请求可以在 android studio 中工作,但不能在模拟器和真实手机(kotlin、ktor)上工作

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

我看过很多关于在android studio中发送http请求的视频,它们涉及“ktor”,“retrofit”,“HttpURLConnection”,“okhttp”等......它们都在android studio中工作得很好,但他们不这样做在真实手机上的模拟器上工作。

当我在 android studio 中运行脚本(运行“MainActivity.kt”)时,它按预期工作,但是当我构建 apk 并在模拟器或真实手机上运行应用程序时,它不起作用。 (我认为该应用程序似乎无法访问互联网)

以下是与情况相关的文件和代码:

res -> xml -> network_security_config.xml :

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">com.example.httprequesttest</domain>
    </domain-config>
</network-security-config>

androidManifext.xml:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">


    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />


    <application
        android:networkSecurityConfig="@xml/network_security_config"
        android:usesCleartextTraffic="true"
        ......
        ......
    </application>

</manifest>

com.example.httprequesttest -> MainActivity.kt :

package com.example.httprequesttest

.....
.....
import io.ktor.client.HttpClient
import io.ktor.client.engine.android.Android
import io.ktor.client.engine.cio.CIO
import io.ktor.client.request.get
import io.ktor.client.statement.HttpResponse


class MainActivity : ComponentActivity() {


    private lateinit var textView: TextView
    private lateinit var getButton: Button
    private lateinit var postButton: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {

            HttpRequestTestTheme {
                Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
                    Greeting(
                        name = "Android",
                        modifier = Modifier.padding(innerPadding)
                    )


                }
            }
        }

        setContentView(R.layout.activity_main)

        textView = findViewById(R.id.textView)
        getButton = findViewById(R.id.getButton)
        postButton = findViewById(R.id.postButton)

        getButton.setOnClickListener {

            textView.text = "status code : $statusCode"
        }


    }


}


var statusCode: String = "nothing yet"
suspend fun main() {
    val client = HttpClient(Android)
    val response: HttpResponse = client.get("https://ktor.io/")
    statusCode = "status: ${response.status}"
    println(statusCode)
    client.close()
}

build.gradle.kts:

......
......
dependencies {

    ......
    ......

    implementation("io.ktor:ktor-client-core:2.3.12")
    implementation("io.ktor:ktor-client-cio:2.3.12")
    implementation("io.ktor:ktor-client-android:2.3.12")
    implementation("io.ktor:ktor-client-serialization:2.3.12")
    implementation("io.ktor:ktor-client-logging:2.3.12")
    implementation("ch.qos.logback:logback-classic:1.5.6")

    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3")



    implementation("io.ktor:ktor-client-okhttp:2.3.12")
    implementation("io.ktor:ktor-client-content-negotiation:2.3.12")
    implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.12")
}

所以当我在 android studio 中运行代码时,我在控制台中得到输出:

status: 200 OK

Process finished with exit code 0

但是当我在模拟器或真实手机中运行时,“statusCode”变量不会改变它仍然“什么都没有”,当单击“getButton”时,“textView.text”从“文本视图”更改为“什么也没有”而不是“状态:200 正常”

我在改造、HttpUrlConnection、okhttp等方面也遇到同样的问题...

如果它尝试以某种方式从“getButton.setOnClickListener{ // send get requets here }”发出http请求,应用程序就会崩溃。 (注意:我确实使用了 runBlocking{ launch{ //send get request here } } ,但它仍然崩溃了)

请帮忙。

谢谢大家。

android http networking httprequest ktor
1个回答
0
投票

当您在模拟器或手机中运行应用程序时,永远不会发出请求,因为函数

main
永远不会执行。

如果您从

onCreate
或任何其他生命周期方法调用它,或者就像您已经在单击侦听器中调用它一样,应用程序可能会像您提到的那样崩溃,在这种情况下,正如 CommonsWare 建议的那样,检查 logcat 以查找堆栈跟踪。如果您不明白崩溃原因,请在这里分享。

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