android实现多线程基础
1 2 3 4 5 6 7 8 9 10 11 | //创建线程类 class Mythread extends Thread{ @Override public void run(){ //定义行为 } } //实例化线程类 MyThread mt= new MyThread(“线程名称”); //// 此处采用 start()开启线程 mt.start(); |
//更加简便的匿名类,调用简单,但是不能复用
new Thread("线程名"){ @Override public void run() { }.start();
Thread与Runnable区别:多线程完成独自的任务与多线程共同完成任务
//注意:其实runnable创建的还是thread类
//实现了Runnable接口的类,称为 线程辅助类;Thread类才是真正的线程类
//创建线程辅助类 class Mythread implements Runnable{ @override public void run(){ } } //实例化线程辅助类 MyThread mt=new MyThread(); //实例化线程类 //runnable接口没有对线程的支持,需要新建一个线程类,从内部运行runnable类 Thread td=new Thread(mt);
// 当调用start()方法时,线程对象会自动回调线程辅助类对象的run(),从而实现线程操作
td.start();
//匿名类runnable Runnable mt = new Runnable(){ @Override public void run() { } }; Thread mt1 = new Thread(mt, "窗口1"); mt1.start();
Handler作用于:将子线程的信息传输到主线程上,实现异步消息处理问题
在主线程实现更新组件保证了安全性,因此在app中通过Handler提醒主线程更新组件
方法1:使用 Handler.sendMessage()
//新建Handler类(内部类) class Myhandler extends Handler{ @Override public void handleMessage(Message msg) { // 需执行的UI操作 } } //在主线中新建handler实例 private Handler mhandler = new mHandler(); //创建所需的消息对象 Message msg = Message.obtain(); // 实例化消息对象 msg.what = 1; // 消息标识 msg.obj = "AA"; // 消息内容存放 //通过Handler发送消息到消息队列 mHandler.sendMessage(msg);
//匿名内部类 //在主线程中创建handler实例 private Handler mhandler = new Handler(){ @Override public void handleMessage(Message msg) { ...// 需执行的UI操作 } }; //创建消息对象 Message msg = Message.obtain(); // 实例化消息对象 msg.what = 1; // 消息标识 msg.obj = "AA"; // 消息内容存放 //发送消息至消息队列中 mHandler.sendMessage(msg);
Handler.post()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // 步骤1:在主线程中创建Handler实例 private Handler mhandler = new mHandler(); // 步骤2:在工作线程中 发送消息到消息队列中 & 指定操作UI内容 // 需传入1个Runnable对象 mHandler.post( new Runnable() { @Override public void run() { ... // 需执行的UI操作 } }); // 步骤3:开启工作线程(同时启动了Handler) |
Handler机制 中有3个重要的类:
- 处理器 类(Handler)
- 消息队列 类(MessageQueue)
- 循环器 类(Looper)
当创建Handler时会自动创建looper和messagequeue,保证了handler的对象与looper和messagequeue的关联
Looper的主要方法
1.Looper.prepareMainLooper();//为主线程创建一个循环器对象
2.Looper.prepare();//为子线程创建一个循环器对象————这两个方法同时都可以创建一个消息队列对象
主线程不需要创建looper对象,会自动生成;但是子线程若不创建looper对象,无法生成handler对象
当生成looper&messagequeue对象时会自动进入消息循环:Looper.loop();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】