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

runOnUiThread-不会运行[重复]

司徒瀚
2023-03-14

从我所读到的一切来看,它应该是可行的,但是以下几点:

runOnUiThread {
               recyclingView_Main.adapter = MainAdapter()
              }

在…内

fun fetchJson(){

        println("attempting to fetch JSON")

        val url = "https://api.drn1.com.au/station/allstations"

        val request = Request.Builder().url(url).build()

        val client = OkHttpClient()
        client.newCall(request).enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {
                e.printStackTrace()
            }

            override fun onResponse(call: Call, response: Response) {
                response.use {
                    if (!response.isSuccessful) throw IOException("Unexpected code $response")

                    for ((name, value) in response.headers) {
                        println("$name: $value")
                    }

                    val body = response.body!!.string()
                    val gson = GsonBuilder().create()
                    val stationfeed = gson.fromJson(body, StationsFeed::class.java)



                    runOnUiThread {
                    recyclingView_Main.adapter = MainAdapter()
                    }
                    println(body)
                }
            }
        })
    }

不工作。与应用程序加载类似,但使用的是recyclingView\u Main。adapter=MainAdapter()似乎未运行。

完整代码:

package com.example.drn1

import android.graphics.Color
import kotlinx.android.synthetic.main.activity_main.*
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import okhttp3.*
import java.io.IOException

class MainActivity : AppCompatActivity() {

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

        recyclingView_Main.layoutManager = LinearLayoutManager( this, LinearLayoutManager.HORIZONTAL, false)

       // recyclingView_Main.adapter = MainAdapter() --- THIS DOES WORK WHEN IT IS HERE

        fetchJson()
    }


    fun fetchJson(){

        println("attempting to fetch JSON")

        val url = "https://api.drn1.com.au/station/allstations"

        val request = Request.Builder().url(url).build()

        val client = OkHttpClient()
        client.newCall(request).enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {
                e.printStackTrace()
            }

            override fun onResponse(call: Call, response: Response) {
                response.use {
                    if (!response.isSuccessful) throw IOException("Unexpected code $response")

                    for ((name, value) in response.headers) {
                        println("$name: $value")
                    }

                    val body = response.body!!.string()
                    val gson = GsonBuilder().create()
                    val stationfeed = gson.fromJson(body, StationsFeed::class.java)



                    runOnUiThread {
                    recyclingView_Main.adapter = MainAdapter()
                    }
                    println(body)
                }
            }
        })
    }
}


class StationsFeed(val data: List<Data>)

class Data(val _id: String, val name: String, val imageurl: String)

正如您从上面的代码中看到的,当我将其放在onCreate中时,它工作得很好。

因此,问题似乎是将其发送到主线程。

XML

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclingView_Main"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.0" />
</androidx.constraintlayout.widget.ConstraintLayout>

共有1个答案

何嘉运
2023-03-14

对我来说解决问题的办法是

Thread {
    runOnUiThread {
        binding.recyclingViewMain.adapter = MainAdapter(stationfeed)
    }
}.start()

我忘记了您需要将Thread包裹在runOnUiThread周围。

 类似资料:
  • (2016.3.15更新) 上周我遇到了一个奇怪的问题,我想和你讨论一下这个问题。 但是,如果我使用sendMessage(SearchHandler.Object...)而不是runOnUiThread,一切都会很顺利!! java: SearchActivity.java: 2)在运行getActivity().runonuithread()之前,首先判断getActivity()==null

  • 我有这个问题。我试图从另一个线程更新我的< code>TextView,但它不允许。 我尝试了一堆不同的解决方案,但没有一个似乎没有帮助。在我的同时循环代码中,一直在打印“开始新循环”,但它没有从该继续。 有人能帮我找出如何从另一个线程更新吗?

  • 需要您的帮助来理解为什么我无法使用JMX从客户端应用程序连接到服务器应用程序。我有一个正在启动JMX Bean服务器的服务器应用程序和一个试图使用JMX连接到此服务器的客户端。这两个应用程序都在Windows中的本地机器上破坏。Jema工作正常,我可以将其连接到服务器。但是在运行客户端时,它会“卡住”在线: 应用端JMX Server初始化代码: 应用程序端JMX服务器JVM参数: 我的客户端连接

  • 如果我在windows的命令行上执行我的python脚本,它运行得很好,但是当我在bash上运行它时,它只是一直在等待另一行,但是如果我尝试其他命令,比如,它会显示:

  • 我有一个在Tomcat7和Tomcat6中运行的web应用程序。但是当我尝试迁移到tomcat 8时,它不允许我这样做,有一些例外,比如下面这样的情况:

  • 问题内容: 我一直在弄乱runOnUiThread方法。如果我只是在活动中创建一个方法: 我注意到该可运行对象仅运行一次。但是,这不是问题。我想知道的是,如果我完全遗漏了某些东西,并且它在后台执行了某些操作,当我多次执行该方法时,它将导致帧速率下降。 问题答案: 这是Activity.runOnUiThread(Runnable)的全文: 该方法的主体是在你的后台线程仍然执行,类mHandler