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)
}
}