Android中几种线程交互方式

0 前言

在Android中ui线程就是主线程。
这里简述复习一下传统的主线程和子线程通信的方式。
在此之前先看看ActivityManager,类似程序管理器,提供活动、服务和包含进程的信息,下面调试会用到。
ActivityManager官方文档
主界面如下:

在这里插入图片描述

1 子线程与主线程的Handler通信

主线程默认自带looper。找到如线程的handler就行。


private val handler = object : Handler() {
	override fun handleMessage(msg: Message) {
    super.handleMessage(msg)
    // 回到主线程(UI线程),处理UI
    getProcessInfo(true)
    	when (msg.what) {
        	0 -> {
            Toast.makeText(this@HandlerTestActivity, "收到子线程发送的消息: ${msg.obj}", Toast.LENGTH_LONG).show()
				}
 			}           
		}
	}
Thread{
      getProcessInfo(false)
      val msg = Message()
      msg.what = 0
      msg.obj = "子线程id是: ${Thread.currentThread().name}"
      handler.sendMessage(msg)
      getProcessInfo(false)     
}.start()

2 View.post

Thread{
	getProcessInfo(false)
	tv_1.post {
		getProcessInfo(true)
 	}
}.start()

3.View.postDelay

Thread{
	getProcessInfo(false)
	tv_1.postDelayed({
 	getProcessInfo(true)
},5000)}.start()

4.runOnUiThread

Thread {
	 // 子线程(工作线程),处理耗时操作
     getProcessInfo(false)
            try {
                Thread.sleep(6000)
            }catch (e: Exception){
                println(e)
            }
            runOnUiThread {
                // 回到主线程(UI线程),处理UI
                getProcessInfo(true)
            }
        }.start()
    }

5 AsyncTask

object : MyAsyncTask(){
}.execute()
 open inner class MyAsyncTask : AsyncTask<String, Void, String>() {
        override fun doInBackground(vararg params: String): String {
            // 子线程(工作线程),处理耗时操作
            getProcessInfo(false)
            return ""
        }

        override fun onPostExecute(result: String) {
            super.onPostExecute(result)
            // 回到主线程(UI线程),处理UI
            getProcessInfo(true)
        }
    }

6 子线程之间通信

class SonTestActivity : BaseActivity() {

    private lateinit var handler: Handler
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_son_test)
        // 创建并启动子线程一
        Thread(ThreadA()).start()
        // 等待线程A准备好
        Thread.sleep(1000)
        // 创建并启动子线程二
        Thread(ThreadB()).start()
    }

    inner class ThreadA : Runnable {
        override fun run() {
            Looper.prepare()
            handler = object : Handler() {
                override fun handleMessage(msg: Message) {
                    super.handleMessage(msg)
                    when (msg.what) {
                        1 -> {
                            Log.e("线程A", "线程B发过来消息了--${msg.obj}")
                        }
                    }
                }
            }
            Looper.loop()
        }
    }

    // 子线程二
    inner class ThreadB : Runnable {
        override fun run() {
            val mess = Message.obtain()
            mess.what = 1
            mess.obj = "线程B${System.currentTimeMillis()}"
            handler.sendMessage(mess)
        }
    }
}

效果:
在这里插入图片描述

7 基类

/**
 * @Author: tian7
 * @Email: 253493510@qq.com
 * @Date: on 2024/8/22: 12: 19
 * @Description: 描述
 */
open class BaseActivity: AppCompatActivity() {
    private lateinit var manager: ActivityManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        manager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
    }
    fun getProcessInfo(isShow: Boolean){
        val processList = manager.runningAppProcesses
        val s1 = StringBuilder()
        for (process in processList){
            s1
                .append("当前进程id")
                .append(process.pid)
                .append("\n当前线程id")
                .append(Thread.currentThread().name)
                .append("\n当前线程状态")
                .append(Thread.currentThread().state)
                .append("\n")
        }
        if (isShow){
            dLog(s1.toString())
        }
    }
    fun dLog(msg: String){
        Log.d("tian",msg)
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值