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

如何使用kotlin更新线程中TextView文本

岑毅庵
2023-03-14

我正在从服务器接收UDP数据,我想将UDP数据显示给TextView。但每次都会发生NullPointerException。我不知道为什么。

下面是我的代码:

open class MainActivity: AppCompatActivity() {

    companion object {
        lateinit var readSocket: DatagramSocket
        lateinit var readPacket: DatagramPacket
        val buffer = ByteArray(2048)
    }

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

        println("Create Runnable example!")
        val threadWithRunnable = Thread(UdpDataArrival())
        threadWithRunnable.start()

        // Add text to textView1
        val textView = findViewById<TextView>(R.id.textView1)
        textView.setText("Hello World from main!\n")

        println("MainActivity onCreate success.")
    }

}

这个类是线程,用于继续接收UDP数据

class UdpDataArrival: Runnable, MainActivity() {

   override fun run() {
       println("${Thread.currentThread()} Runnable Thread Started.")
       readSocket = DatagramSocket(Settings.remotePort)
       readSocket.broadcast = true
       readPacket = DatagramPacket(buffer, buffer.size)
       while (true) {
           receiveUDP()
       }
   }

   open fun receiveUDP() {
       try {
            // Keep a socket open to listen to all the UDP traffic that is destined for this port
            readSocket.receive(readPacket)
            println("open fun receiveUDP packet received = " + readPacket.data)

            str = String(readPacket.data, 0, readPacket.length, Charsets.UTF_8)

            println(str)

            // I tried to update textview in here but the exception occurs
            //textView1.setText(str)

        } catch (e: Exception) {
           println("open fun receiveUDP catch exception.$e")
           e.printStackTrace()
        }
//        finally {
//           readSocket?.close()
//        }

    }
}

我应该做什么来向TextView显示'str'?

这是StackTrace:

java.lang.NullPoInterException:尝试在Android.Content.ContextWrapper.GetApplicationInfo(ContextWrapper.getApplicationInfo())(ContextWrapper.java:173)(Android.View.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:174)(Android.Content.Context.ObtainStyleDatTributes(Context.java:744)(AndroidX.AppCompat.AppCompatDelegateImpl.CreateSubdecor(roid.os.handler.dispatchMessage(handler.java:99)在android.os.looper.loop(looper.java:223)在android.app.activitythread.main(activitythread.java:7656)在java.lang.reflect.Method.invoke(本机方法)在com.android.internal.os.runtimeinit$methodandargscaller.run(runtimeinit.java:592)在com.android.internal.os.zygoteinit.main(

共有1个答案

仉昂熙
2023-03-14

在settext周围添加UI线程或访问UI线程内的任何UI小部件

runOnUiThread {
   textView.setText(str)       
}
 类似资料:
  • 问题内容: 我正在制作一个需要一堆日记条目并计算总和的应用程序。 下面的方法是在有 多个线程 调用该方法时是线程/并发安全的。我想确保每个电话都能正确更新总数。 如果不安全,请说明为确保线程安全我该怎么做。 我需要获取/放置还是有更好的方法? 非常感谢! 更新: 谢谢大家的回答,我已经知道上面的代码 不是线程安全的 。 感谢Vint建议使用替代。我以前用来保存整数和,我想知道BigDecimal是

  • 问题内容: 我有主要的仓库管理人员,他在其中将整数值设置为textview,现在我希望在调用onResume()时更新此值…但是当我添加我的一点onResume()代码时 到该应用程序,我什至无法启动它,LogCat变得非常疯狂,并且没有记录任何活动超过半秒钟。有什么办法吗?提前致谢 问题答案: 我将从添加: 我还将删除该内容: from ,因为每次都被调用,所以也被调用。

  • 我在Elasticsearch中索引了一个文档,如下所示: 我尝试通过以下命令更新计数字段: 但是,我收到了以下错误: 我到底做了什么,却不见了?我在http://www.elasticsearch.org/guide/reference/api/update.html跟踪文件,但它不起作用。 此外,我还包括父字段: 但还是没有成功。有人能帮我解决这个错误吗?

  • 大家早上好。我从标题中知道它是一切都混淆了,所以我会试着解释得更好。我需要为一个医疗项目创建一个计算糖化血红蛋白的应用程序。我有3个编辑文本,我在其中输入医学测试的值。三者中的每一个都因另一个而改变。举个例子:如果我一个有42,另一个是5.99%。诸如此类。我试图让它们动态地变化:在我写作的过程中保持不变。我尝试使用OnCliclListener,但是我必须写完整的值。 我不知道我解释得好不好让你

  • //这是我使用kotlin的扫描仪条形码 覆盖趣味接收检测(检测:检测器。检测){ //这是我的输入页面 覆盖CreateView上的乐趣(膨胀器:LayoutInflater,容器:ViewGroup?,保存的InstanceState:Bundle?):视图?{

  • 我试图通过调用setText()方法更新TextView对象的文本。我直接向它提供了一个字符串值,但我无法让它在运行在仿真器上的应用程序的UI上更新。 这是发生在一个片段上(在Android Studio上创建带有简单activity的项目时自动生成的片段之一) 关于我目前的情况,有几点: > 我尝试用runOnUiThread“pattern”调用setText()方法,但没有成功。 我检查了T