我正在从服务器接收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(
在settext周围添加UI线程或访问UI线程内的任何UI小部件
runOnUiThread {
textView.setText(str)
}