Android Kotlin API 请求 | gson进程后访问列表

Posted

技术标签:

【中文标题】Android Kotlin API 请求 | gson进程后访问列表【英文标题】:Android Kotlin API Request | Access the list after the gson process 【发布时间】:2020-08-25 08:31:37 【问题描述】:

我试图在“mainactivity”中访问我的列表-> api 请求后的 StartActivity:

“mainactivity”-> StartActivity:


class StartActivity : AppCompatActivity() 


    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.startseite)

        fetchJson()



        ...



    
    fun fetchJson() 
        println("Attempting to Fetch JSON")

        val url = "https://....."
        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()

                val gson = GsonBuilder().create()

                val statsVideoList: List<StatsVideo> = gson.fromJson(body, Array<StatsVideo>::class.java).toList()
                for (jetpack_featured_media_url in statsVideoList) 
                    println("The link is$jetpack_featured_media_url")
                

            


            override fun onFailure(call: Call, e: IOException) 
                println("Failed to execute request")
            
        )
    


class StatsVideo (val id: Int, val status: String , val title: Title, val jetpack_featured_media_url: String, val link: String)

class Title (val rendered: String)

现在我想在这个 Activity (StartActivity) 中使用列表。例如。在 ImageView 中使用 picasso 加载 jetpack_featured_media_url

我如何访问这个字符串?

现在我想从 component1 获取 url / string jetpack_featured_media_url 并用 picasso 加载它们。

我的代码:

Picasso.get().load(statsVideoList.component1().jetpack_featured_media_url).into(imageView)

但在应用程序启动时我收到此错误 "

020-05-10 07:26:42.397 17384-17457/com.example.exampleE/androidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
    Process: com.example.example, PID: 17384
    java.lang.IllegalStateException: Method call should happen from the main thread.
        at com.squareup.picasso.Utils.checkMain(Utils.java:127)
        at com.squareup.picasso.RequestCreator.into(RequestCreator.java:679)
        at com.squareup.picasso.RequestCreator.into(RequestCreator.java:665)
        at vision.spectre.lernbox.StartActivity$fetchJson$1.onResponse(Startseite.kt:68)
        at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:504)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)
Method call should happen from the main thread.

但是如果我现在想制作一个按钮来启动一个新的活动并用它“传输”一个字符串

val buttonLatestVid = findViewById<ImageButton>(R.id.imageButton)
        buttonLatestVid.setOnClickListener 
            val intent = Intent(this, LatestVideoDetailActivity::class.java)
            intent.putExtra("VideoLink", statsVideoLost.component1().jetpack_featured_media_url)
            startActivity(intent)
        

statsVideoList 是否不可访问,因为它不在 onResponse 中 但是如果我在 onResponse 中设置按钮,Intent 会给我这个错误:

None of the following functions can be called with the arguments supplied: public constructor Intent(packageContext!, Context!, cls:Class<*>!) defined in android.content.Intentpublic constructor Intent(action: String!, uri: Uri!) defind in android.content.Intent

【问题讨论】:

您无法将响应排除在外。它是异步的,您的函数只会将请求排队并退出。在请求完成之前它不会阻塞主线程,否则它将冻结您的应用程序。能????您提供了为什么要在块之外进行响应的用例?为您进一步提供帮助。顺便说一句,为什么不在 onResponse 中使用您的列表? 好的,谢谢。这个问题可能有点愚蠢,但我还没有找到答案。我现在如何获得 val / var?可能与 statsVideoList 相关。 ,但 android studio 只建议列表的功能。也许你能帮帮我? 你想做什么? 感谢帮助我 嘿,你能再帮我一次吗?将问题添加到帖子中 【参考方案1】:

RequestCreator.into() 调用应该从主线程发生。只需在进行任何 UI 更改之前更改线程即可。

如果您使用协程:

Picasso.get().load(statsVideoList.component1().jetpack_featured_media_url).also 
    withContext(Dispatchers.Main.immediate) 
        it.into(imageView)
    

如果您不这样做:

Picasso.get().load(statsVideoList.component1().jetpack_featured_media_url).also 
    runOnUiThread 
        it.into(imageView)
    

【讨论】:

PS:协程方式更轻更快。 非常感谢,你帮了我很多 你能再帮帮我吗,我还是有问题。我把它加回了帖子。很抱歉再次打扰您。 @iGhost 用this@StartActivity 代替这个

以上是关于Android Kotlin API 请求 | gson进程后访问列表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Retrofit Android Kotlin 发布 [重复]

如何在 Kotlin 中发出 API 请求?

Android 上的 Kotlin - 是不是有最低 API 级别要求?

【Android Kotlin】关于使用Http来获取数据的基本套路

如何使用 Kotlin Flow 链接 API 请求

在 kotlin (Android ) 中发送获取请求