Kotlin异步更新主线程
2019-04-12 本文已影响0人
ZYiDa
常用情况:开启子线程进行耗时操作,然后把结果返回给主线程
代码如下:
const val MSG_KEY = "message_key"
class MainActivity : AppCompatActivity() {
private var index:Int = 0
private lateinit var tv:TextView
private lateinit var calThread:CalThread
//定义一个子线程类,处理耗时任务
internal inner class CalThread():Thread(){
lateinit var mHandler:Handler
override fun run() {
super.run()
Looper.prepare()
mHandler = object :Handler(){
//定义处理消息的方法
override fun handleMessage(msg: Message?) {
super.handleMessage(msg)
try {
if (msg!!.what == 0x123){
val mms = msg.data.getString(MSG_KEY)?:""
//发一个新的消息给主线程
val message = Message()
message.what = 0x1234
message.data = msg!!.data
myHandler.sendMessage(message)
}
}catch (exception:Exception){
Log.v("CalThread","$exception")
}
}
}
Looper.loop()
}
}
//声明Handler来处理UI事务
private val myHandler:Handler = MyHandler(WeakReference(this))
class MyHandler(private val activity:WeakReference<MainActivity>):Handler(){
override fun handleMessage(msg: Message?) {
try {
if (msg!!.what == 0x1234){
activity.get()?.tv?.text = msg!!.data.getString(MSG_KEY)
}
}catch (exception:Exception){
Log.v("MyHandler","$exception")
}
super.handleMessage(msg)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
tv = findViewById(R.id.tvvt)
tv.textSize = 16F
calThread = CalThread()
calThread.start()
}
fun btnAction(source:View){
//创建消息
val msg = Message()
msg.what = 0x123
val bundle = Bundle()
bundle.putString(MSG_KEY,"**第 $index 个消息**")
msg.data = bundle;
calThread.mHandler.sendMessage(msg)
index++;
}
}
不足的地方,希望各位大佬能多多指教,谢谢了。