一. 创建子线程//通过继承threadpublic class JNThread1 extends Thread {public JNThread1(String name){super(name);}@Overridepublic void run() {Message msg = new Message();msg.obj = "I am a message!";mHandler.sendMessage(msg);}}//通过实现Runnable接口来创建子线程public class JNThread2 implements Runnable{public void run() {}}JNThread1 thread = new JNThread1("jiang");thread.start();
1
2
二. 子线程回调主线程的方式1.view.post(Runnable action)这是我认为最简单的方法了,比如你在子线程获得了多个数据,需要更新textview显示这些数据,可以这样做textView.post(new Runnable() { @Override public void run() { textView.setText("更新啦!"); //还可以更新其他的控件}
});这是view自带的方法,比较简单,如果你的子线程里可以得到要更新的view的话,可以用此方法进行更新。view还有一个方法view.postDelayed(Runnable action, long delayMillis)用来延迟发送。2,activity.runOnUiThread(Runnable action)这是我认为第二简单的方法了,一般我的上下文(context)是大部分类都会传到的,而这个 context 其实就是我的 MainActivity,我会直接强制转换成 Activity 然后用activity.runOnUiThread(Runnable action)方法进行更新UI/** * 假设该更新方法在子线程中运行 * @param context 上下文 * /
public void update(final Context context) {
((MainActivity) context).runOnUiThread(new Runnable() {@Override public void run() { //已在主线程中,可以更新UI}
}如果没有上下文(context)怎么办?用view.getContext()可以得到上下文(不过你为什么不直接用方法一呢?)
跳过context直接用new Activity().runOnUiThread(Runnable action)来切换到主线程。重点内容3,HandlerHandler 是最常用也是比上面稍微复杂一点的方法。首先在主线程中定义Handler,Handler mainHandler = new Handler();(必须要在主线程中定义才能操作主线程,如果想在其他地方定义声明时要这样写Handler mainHandler = new Handler(Looper.getMainLooper()),来获取主线程的 Looper 和 Queue )
获取到 Handler 后就很简单了,用handler.post(Runnable r)方法把消息处理放在该 handler 依附的消息队列中(也就是主线程消息队列),这也是为什么我们第一步一定要获取主线程的 handler,如果在子线程中直接声明 handler,调用handler.post(Runnable r)其实还是在子线程中调用//假设已在子线程 Handler mainHandler = new Handler(Looper.getMainLooper());
mainHandler.post(new Runnable() { @Override public void run() { //已在主线程中,可以更新UI }
});其实一般 Handler 是和 Message 一起使用的。//假设在主线程中 Handler myHandler = new Handler() {@Override public void handleMessage(Message msg) { switch(msg.what) { case 0: //xxx操作 case 1: //yyy操作 break; default: break; } }之后可以把 mainHandler 当做参数传递在各个类之间,当需要更新UI时,可以调用sendMessage一系列方法来执行handleMessage里的操作。//假设现在在子线程了
//获取消息
Message msg = myHandler.obtainMessage(); msg.what = 0;
//消息标识
//msg.obj 用来提供额外对象参数
//发送消息
myHandler.sendMessage(msg);如上代码,只是发送了个消息标识,并没有传其他参数(可以用msg.arg1
和 msg.arg2
用来提供额外int型参数,用msg.obj
用来提供额外对象参数),可以用简化方法sendEmptyMessage(int what)
来减少不必要的代码myHandler.sendEmptyMessage(0); //其实内部实现还是和上面一样sendEmptyMessageAtTime(int what, long uptimeMillis); //定时发送消息
sendEmptyMessageDelayed(int what, long delayMillis); //延时发送空消息
sendMessageAtFrontOfQueue(Message msg); //最先处理消息(慎用)
sendMessageAtTime(Message msg, long uptimeMillis); //定时发送消息
sendMessageDelayed(Message msg, long delayMillis); //延时发送消息
---------------------
原文:https://blog.csdn.net/zixiweimi/article/details/53164707 

Android创建子线程和回调主线程的几种方式相关推荐

  1. 【Android】子线程切回主线程的方法梳理

    [Android]子线程切回主线程的方法梳理 view.post(Runnable action) textView.post(() -> {textView.setText("更新t ...

  2. android开发返回主线程,安卓回到主线程的几种方式

    方法一: view.post(Runnable action) 假如该方法是在子线程中 textView.post(new Runnable() { @Override public void run ...

  3. 【Android 异步操作】Android 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )

    文章目录 一.判定当前线程是否是主线程 二.子线程中执行主线程方法 三.主线程中执行子线程方法 一.判定当前线程是否是主线程 在 Android 中 , 如果要判定当前线程是否是主线程 , 可以使用如 ...

  4. [Android] 任意时刻从子线程切换到主线程的实现

    [Android] 任意时刻从子线程切换到主线程的实现 - Android移动开发技术文章_手机开发 - 红黑联盟 转载于:https://www.cnblogs.com/melons/p/57919 ...

  5. DLL内线程同步主线程研究(子线程代码放到主线程执行)

    DLL内线程同步主线程研究(子线程代码放到主线程执行) 我们在实际项目中经常会用到多线程编程,比如Socket编程等,在创建的线程内同步主线程一般使用Synchronize方法实现子线程操作放到主线程 ...

  6. C#多线程下, 子线程如何让主线程执行方法

    C#多线程下, 子线程如何让主线程执行方法 重现一下当时我的需求: 我开了多个线程, 来监视一个变量, 然后去执行一些方法. 看起来没什么毛病, 但是运行起来会报错 此对象被其他线程占用 一开始想着可 ...

  7. 在子线程中更改主线程中的控件的信息,在子线程中用toast

    一丶在子线程中不允许更改主线程中的控件的信息,也不允许在子线程中用toast,我们要更改的话 (1)消息机制:使用handler (由主线程调用) 在主程序中Handler handler = new ...

  8. java主线程和子线程区别_主线程异常– Java

    java主线程和子线程区别 Being a Java Programmer, you must have seen exception in thread main sometimes while r ...

  9. c++ 等待子线程结束_python主线程与子线程的结束顺序

    对于程序来说,如果主进程在子进程还未结束时就已经退出,那么Linux内核会将子进程的父进程ID改为1(也就是init进程),当子进程结束后会由init进程来回收该子进程. 主线程退出后子线程的状态依赖 ...

最新文章

  1. 2019数字化趋势:未来5年政府、零售数字化程度将达80%
  2. iOS视图控制对象生命周期-init、viewDidLoad、viewWillAppear、v...
  3. Siri和Alexa背后的女科学家逝世,是她让AI有了女声
  4. 广告小程序后端开发(4.导入地区数据,修改adminx,修改models,手动添加模拟数据)...
  5. windows不能改密码
  6. Angular 条件指令 ngIf 的一个例子
  7. oracle查询语句大全(oracle 基本命令大全一)
  8. 深度学习-TF函数-layers.concatenate用法
  9. 诗与远方:无题(九十)
  10. Python 基础总结
  11. PHP动态生成select标签
  12. 不一样的Office 365之 —— 使用Delve查看热门文档
  13. selenium模拟点击的几种方法探讨
  14. python实现定时自动发送qq消息
  15. 真正免费的证件照小程序,在线一键生成标准免冠证件照,证件照底色更换,证件照尺寸修改
  16. 串口接收完整一帧数据包的3种方法
  17. 2021年烷基化工艺找解析及烷基化工艺考试试卷
  18. 【哈利波特全集】哈利波特1-7
  19. Android 11 自动亮度调试流程
  20. fluent-edem耦合出错,如何继续计算。

热门文章

  1. PHP根据生日计算年龄(周岁)
  2. 文字转语音+html5,HTML5新特性之文字转语音
  3. 电脑突然没有网络,发现电脑无法打开WiFi列表,打开设备管理器,发现intel(R)wireless-ac 9462感叹号
  4. 超大Excel文件读写 :使用SXSSFWorkbook和EasyExcel方式对比
  5. 设计模式|职责链模式--流程状态审批(枚举实现)
  6. 原生JS实现拖动拉开序幕特效
  7. 杨桃文案:卖杨桃水果怎样写文案发朋友圈,水果店杨桃活动文案
  8. 一句话解决汉诺塔(C语言递归)每日一练
  9. 西部数据蓝盘 绿盘和黑盘 到底有什么区别?
  10. Latex声调(一声、二声、三声等)