美文网首页
Kotlin异步更新主线程

Kotlin异步更新主线程

作者: ZYiDa | 来源:发表于2019-04-12 17:35 被阅读0次

常用情况:开启子线程进行耗时操作,然后把结果返回给主线程
代码如下:

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

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

相关文章

  • Kotlin异步更新主线程

    常用情况:开启子线程进行耗时操作,然后把结果返回给主线程代码如下: 不足的地方,希望各位大佬能多多指教,谢谢了。

  • Kotlin—Coroutine(协程)的基本使用

    Kotlin—Coroutine(协程)的基本使用 什么是协程 在java中异步都会使用到线程,在kotlin中引...

  • Handler使用

    主要用于异步处理: 存在于线程中开启子线程:异步处理 主要接受子线程发送的数据,并用此数据配合主线程更新UI ··...

  • 异步消息处理

    异步消息处理 android耗时操作只能放在非主线程,message从子线程进入主线程,从不能更新UI到更新UI,...

  • Kotlin协程基础篇

    什么是协程 kotlin中的线程框架,是对线程的上层封装,可同步代码实现异步操作。 什么时候用 1.切换线程或者指...

  • 蓝牙ble开发注意事项

    (1)蓝牙回调 安卓4.4的蓝牙回调是在异步线程中(不在主线程),若要在蓝牙回调中执行更新界面的操作,记得切换到主...

  • 八,Kotlin协程详解

    概念 Kotlin协程是一个异步框架,是建立在线程基础上轻量级的线程.协程依赖于线程,但是协程挂起时不需要阻塞线程...

  • Kotlin 协程与架构组件一起使用及底层原理分析

    kotlin的协程封装了线程的API,这个线程框架可以让我们很方便得编写异步代码。 虽然协程已经很方便了,但是如果...

  • Android多线程的四种方式:Handler、AsyncTas

    1.Handler(适用于多个异步任务的更新UI) 异步通信机制,将工作线程中需更新UI的操作信息 传递到 U...

  • 67. (android开发)kotlin异步更新主线程

    前几天抽空写了个文件和数据同时上传的内容。因为是go语言服务端为主,虽然客户端是kotlin android,但是...

网友评论

      本文标题:Kotlin异步更新主线程

      本文链接:https://www.haomeiwen.com/subject/wdhhwqtx.html