Android中按钮启动Runnable线程的运行与管理问题咨询
Android线程相关疑问解答
代码背景
在MainActivity.kt的onCreate方法中定义的Runnable:
runnable = Runnable { // Code to run in the background thread val myURL = "mydomain.com/myjson.php" thejsonstr = URL(myURL).readText() runOnUiThread { // Code to update UI elements } }
按钮点击事件启动线程的代码:
btnjson.setOnClickListener { val thread = Thread(runnable) thread.start() Toast.makeText(this@MainActivity, thejsonstr, Toast.LENGTH_SHORT).show() }
疑问与解答
1. 线程会反复请求JSON数据,还是仅运行一次?
你的线程只会执行一次请求逻辑。Runnable的run()方法是顺序执行的:完成网络请求、执行完runOnUiThread里的代码后,run()方法就执行完毕,线程进入终止状态,不会自动重复执行。只有再次调用thread.start(),才会重新跑一遍Runnable里的代码。
2. 每次点击按钮都会创建新线程吗?
是的,每次点击都会创建全新的线程。因为你在点击事件里每次都执行val thread = Thread(runnable),这行代码每次都会实例化一个新的Thread对象,调用start()后就会启动一个独立的线程。
补充问题:能否在启动新线程前销毁旧线程?系统会自动清理已停止的线程吗?
- 已经运行结束的线程不需要手动销毁,系统的垃圾回收机制会自动回收这些处于终止状态的线程对象,不用额外处理。
- 如果是想终止正在运行的旧线程(比如上次点击的线程还在请求数据,尚未结束),需要额外处理:
- 用成员变量保存之前启动的Thread实例(比如
private var currentThread: Thread? = null); - 在点击按钮时,先检查
currentThread是否存活(currentThread?.isAlive == true); - 如果存活,调用
currentThread?.interrupt()标记线程中断; - 同时要在Runnable的代码里检查中断状态,比如在网络请求前后判断
Thread.currentThread().isInterrupted(),如果已中断就主动退出执行逻辑,否则线程可能会继续运行。
- 用成员变量保存之前启动的Thread实例(比如
内容的提问来源于stack exchange,提问作者ThN
相关产品推荐
相关产品推荐

