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++;
    }
}

不足的地方,希望各位大佬能多多指教,谢谢了。

上一篇 下一篇

猜你喜欢

热点阅读