【问题标题】:How to print on the screen having an API request?如何在有 API 请求的屏幕上打印?
【发布时间】:2021-01-21 06:50:06
【问题描述】:

我已经学习了几个创建 API 请求并在屏幕上打印的教程,但我所做的所有教程都有一些现在无法使用的已弃用功能。

我有什么?正如您在代码中看到的那样,我有 API 请求,但现在我需要在屏幕上打印。而且我不知道该怎么做

PS:我使用 okhttpgson

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        fetchJson()
    }

    fun fetchJson() {
        val url = "https://api.letsbuildthatapp.com/youtube/home_feed"
        var request = Request.Builder().url(url).build()
        var client = OkHttpClient()

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

                val homeFeed = gson.fromJson(body, HomeFeed::class.java)
                println(homeFeed.videos)
            }
            override fun onFailure(call: Call, e: IOException) {
                println("Failed on execute")
            }
        })

    }

}

class HomeFeed(val videos: List<Video>)

class Video(val id: Int, val name:String, val link: String, val imageUrl: String, numberOfViews: String, val channel: Channel)

class Channel(val name: String, val profileImageUrl: String)

【问题讨论】:

    标签: android android-layout kotlin gson okhttp


    【解决方案1】:

    要将您的调试日志打印到Logcat,只需使用:

    Log.d("TAG", "videos: ${homeFeed.videos}")
    

    注意:要以人类可读的方式打印视频列表,您必须将 VideoChannel 类设为数据类(这会自动覆盖它们的 toString() 函数):

    data class Video(val id: Int, val name:String, val link: String, val imageUrl: String, numberOfViews: String, val channel: Channel)
    data class Channel(val name: String, val profileImageUrl: String)
    

    此外,作为一个长期解决方案,在使用 okhttp 时,还有一种更好的方式来进行 HTTP 日志记录(用于调试目的),它依赖于使用 HttpLoggingInterceptor

    因此,要打印带有错误代码的所有 HTTP 请求和响应,只需向您的客户端添加 httpLoggingInterceptor,如下所示:

    val httpLoggingInterceptor = HttpLoggingInterceptor().apply {
            level = HttpLoggingInterceptor.Level.BODY
        }
    val client: OkHttpClient = OkHttpClient.Builder()
        .addInterceptor(httpLoggingInterceptor)
        .build()
    

    您可以阅读更多关于 OkHttp 拦截器的信息here

    【讨论】:

      【解决方案2】:

      print()/println() 在 Android 中不起作用。

      你有两个选择:

      1. 将 TextView 添加到您的活动并在那里显示文本

        textView.text = homeFeed.videos
        

        textView.text = "Failed on execute"
        
      2. 使用logcatLog.d()Log 类中的类似方法。

      【讨论】:

      • 第一个不知道怎么用。
      猜你喜欢
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      • 2014-09-04
      • 2020-01-20
      • 1970-01-01
      相关资源
      最近更新 更多