当前位置: 首页 > 知识库问答 >
问题:

静态编程语言|okhttp的API请求

皇甫智明
2023-03-14

解决方案:

class MainActivity : AppCompatActivity() {
    lateinit var playerStats: PlayerStats

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Picasso.get().load("https://...../....../example.png").into(Viewer)
        var PlayerName: String = ""

        fun fetchJson() {
            val url = "https://my.api.site/example/"
            val request = Request.Builder().url(url).build()
            val client = OkHttpClient()
            client.newCall(request).enqueue(object : Callback {
                var mainHandler = Handler(this@MainActivity.getMainLooper())
                override fun onResponse(call: Call, response: Response) {
                    mainHandler.post {
                        val body = response.body()?.string()
                        if (body == null) return@post
                        println(body)

                        val gson = GsonBuilder().create()
                        playerStats = gson.fromJson(body, PlayerStats::class.java)
                        println(playerStats)

                        // TODO Now you can access to your view and set every thing to textView
                        textView.text = playerStats.username
                    }
                }

                override fun onFailure(call: Call, e: IOException) {
                    println("API execute failed")
                }
            })
        }

        buttonGO.setOnClickListener {
            PlayerName = editText.text.toString()
            fetchJson()
            if (PlayerName == null || PlayerName.trim() == "") {
                println("please input data, input cannot be blank")
            } else {
                Picasso.get().load("https://...../...../" + PlayerName + ".png")
                    .into(Viewer)
                textView.setText(PlayerName).toString()
            }
        }
    }
} ```

我为我的api请求准备了这段代码,当我使用调试器时,它可以工作。

我可以在PlayerStats课程中看到结果,但现在我遇到了一个问题。

但是在MainActivity.class这个函数不工作:

val url = "https://api.example.com/..../"
val request = Request.Builder().url(url).build()
val client = OkHttpClient()

client.newCall(request).enqueue(object: Callback {
    override fun onResponse(call: Call, response: Response) {
        val body = response?.body?.string()
        println(body)
        val gson = GsonBuilder().create()
        val PlayerStats = gson.fromJson(body, PlayerStats::class.java)
        println(PlayerStats)
    }

    override fun onFailure(call: Call, e: IOException) {
        println("API execute failed")
    }
})

统计数据。课程:

class PlayerStats(val username: String  , val level: Double )

我需要一种从main活动

class MainActivity(val mystats: PlayerStats) : AppCompatActivity(){

不工作,因为零参数。

如果我试图修复:

class MyActivity: AppCompatActivity() {
    var myStats: Stats? = null
//..
}

IDE说它需要一个安全调用或一个非空断言调用,但如果我尝试使用非空断言调用,应用程序就会崩溃,我会得到以下错误:

2020-03-05 18:58:02.803 23276-23276/我的。实例包E/AndroidRuntime:致命异常:主进程:我的。实例包裹,PID:23276科特林。Kotlinnullpointer在我的。实例包裹MainActivity$onCreate$1。在我的位置调用(MainActivity.kt:31)。实例包裹主要活动$onCreate$3。Android上的onClick(MainActivity.kt:68)。看法看法android上的performClick(View.java:7125)。看法看法android上的performClickInternal(View.java:7102)。看法看法在Android上获得3500美元(View.java:801)。看法查看$PerformClick。在android上运行(View.java:27336)。操作系统。汉德勒。android上的handleCallback(Handler.java:883)。操作系统。汉德勒。android上的dispatchMessage(Handler.java:100)。操作系统。活套。android上的loop(Looper.java:214)。应用程序。活动线程。java上的main(ActivityThread.java:7356)。朗,反思一下。方法在com上调用(本机方法)。Android内部的操作系统。RuntimeInit$MethodAndArgsCaller。在com上运行(RuntimeInit.java:492)。Android内部的操作系统。合子体。main(ZygoteInit.java:930)

安全调用我得到null作为输出

完整代码:

MainActivity.class:

package my.example.package

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.google.gson.GsonBuilder
import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.activity_main.*
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.*
import java.io.IOException

class MainActivity : AppCompatActivity(){
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Picasso.get().load("https://...../....../example.png").into(Viewer)
        var PlayerName: String = ""
        fun fetchJson() {
            val url = "https://my.api.site/example/"
            val request = Request.Builder().url(url).build()
            val client = OkHttpClient()
            client.newCall(request).enqueue(object: Callback {
                override fun onResponse(call: Call, response: Response) {
                    val body = response?.body?.string()
                    println(body)
                    val gson = GsonBuilder().create()
                    val PlayerStats = gson.fromJson(body, PlayerStats::class.java)
                    println(PlayerStats)
                }
                override fun onFailure(call: Call, e: IOException) {
                    println("API execute failed")
                }
            })
        }

        buttonGO.setOnClickListener {
            PlayerName = editText.text.toString()
            fetchJson()
            if (PlayerName == null || PlayerName.trim() == "") {
                println("please input data, input cannot be blank")
            } else {
                Picasso.get().load("https://...../...../" + PlayerName + ".png")
                    .into(Viewer)
                textView.setText(PlayerName).toString()
            }
        }
    }
}

玩家状态。课程:

package my.example.package
class PlayerStats(val username: String  , val level: Double )

共有1个答案

岳浩宕
2023-03-14

将此替换为您的代码:

class MainActivity : AppCompatActivity() {
    lateinit var playerStats: PlayerStats

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Picasso.get().load("https://...../....../example.png").into(Viewer)
        var PlayerName: String = ""

        fun fetchJson() {
            val url = "https://my.api.site/example/"
            val request = Request.Builder().url(url).build()
            val client = OkHttpClient()
            client.newCall(request).enqueue(object : Callback {
                var mainHandler = Handler(this@MainActivity.getMainLooper())
                override fun onResponse(call: Call, response: Response) {
                    mainHandler.post {
                        val body = response.body()?.string()
                        if (body == null) return@post
                        println(body)

                        val gson = GsonBuilder().create()
                        playerStats = gson.fromJson(body, PlayerStats::class.java)
                        println(playerStats)

                        // TODO Now you can access to your view and set every thing to textView
                        textView.text = playerStats.username
                    }
                }

                override fun onFailure(call: Call, e: IOException) {
                    println("API execute failed")
                }
            })
        }

        buttonGO.setOnClickListener {
            PlayerName = editText.text.toString()
            fetchJson()
            if (PlayerName == null || PlayerName.trim() == "") {
                println("please input data, input cannot be blank")
            } else {
                Picasso.get().load("https://...../...../" + PlayerName + ".png")
                    .into(Viewer)
                textView.setText(PlayerName).toString()
            }
        }
    }
} ```

 类似资料:
  • 我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?

  • 如图所示,https://stackoverflow.com/a/16639438/8949356,在Java中,当声明的类是公共类时,可以重写其函数 但是我想知道如何用静态编程语言编写完全相同的代码,我已经尝试了很多,但没有找到任何关于这个主题的东西。我可以在Java中去做这件事,但我的其余代码是用静态编程语言编写的,而且我不能一直带着这种怀疑;静态编程语言对我来说是一个很好的工具,我想学习它。

  • 为了描述Gradle构建脚本,我们可以通过< code>build.gradle.kts文件使用Kotlin。在< code>dependencies和build 部分全局定义要使用的Kotlin版本是一个常见的问题(在给定的情况下使用不同的版本是相当罕见的)。 请考虑以下代码 (Gradle 4.3.1): 如您所见,kotlin(在本例中为1.2.30)定义了两次:和,它们通常没有区别。由于D

  • 上周我更新了Kotlin 1.5,昨天看到谷歌打算让Jetpack成为设计UI的首选选项后,我想做一些测试。 问题是将我的项目更新为静态编程语言1.5,当尝试构建项目时,我得到以下错误: 静态编程语言1.5与Jetpack Compose不兼容吗?在谷歌搜索问题后,我找到了版本,其中提到了Jetpack Compose,但不是以“不兼容”的方式。 你对此有任何答案吗?我应该使用吗?在这种情况下,我

  • 我正在尝试用Java编写下面用Kotlin编写的代码。我无法创建DefaultElementsAdapter,因为我无法获得正确的语法。 我无法获得正确的Java代码 Kotlin班是这样的 我正在尝试使用图书馆https://github.com/m7mdra/HtmlRecycler

  • 如何在 Kotlin 中制作 2D Int 数组?我正在尝试将此代码转换为 Kotlin: 这是我尝试过的一个尝试,第一个2D阵列不起作用,但我让1D阵列起作用了: