Android中几种线程交互方式
目录
- 0 前言
- 1 子线程与主线程的Handler通信
- 2 View.post
- 3.View.postDelay
- 4.runOnUiThread
- 5 AsyncTask
- 6 子线程之间通信
- 7 基类
0 前言
在Android中ui线程就是主线程。
这里简述复习一下传统的主线程和子线程通信的方式。
在此之前先看看ActivityManager,类似程序管理器,提供活动、服务和包含进程的信息,下面调试会用到。
ActivityManager官方文档
主界面如下:
1 子线程与主线程的Handler通信
主线程默认自带looper。找到如线程的handler就行。
private val handler = object : Handler() {override fun handleMessage(msg: Message) {super.handleMessage(msg)// 回到主线程(UI线程),处理UIgetProcessInfo(true)when (msg.what) {0 -> {Toast.makeText(this@HandlerTestActivity, "收到子线程发送的消息: ${msg.obj}", Toast.LENGTH_LONG).show()}} }}
Thread{getProcessInfo(false)val msg = Message()msg.what = 0msg.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线程),处理UIgetProcessInfo(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线程),处理UIgetProcessInfo(true)}}
6 子线程之间通信
class SonTestActivity : BaseActivity() {private lateinit var handler: Handleroverride 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 = 1mess.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: ActivityManageroverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)manager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager}fun getProcessInfo(isShow: Boolean){val processList = manager.runningAppProcessesval 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)}
}