【Android】如何方便地将代码抛到主线程执行
来源:互联网 发布:剑网三光头捏脸数据 编辑:程序博客网 时间:2024/06/05 11:26
稍微有过Andorid开发经验的同学都知道,Android开发中涉及到UI变动的操作,必须在主线程中执行, 否则会crash, 报错如下:
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
这就需要我们将代码抛到主线程执行。
第一种方式,是通过Activity.runOnUiThread()来做。这不是一个好方法,毕竟Activity这种东西,在子线程中可遇不可求。也千万不要因此而将Activity传来传去,甚至对Context进行强转,那样太过难看。
那么,只剩下通过Handler手动将代码抛到主线程了。这就需要,Handler具有主线程的Looper对象。具体的原因可以参考我之前的博客:【Android】结合源码解析Android消息队列工作流程 。
两种实现方式:
1. 在主线程中创建Handler
2. 直接通过MainLooper,构造handler
这里抛弃方法1, 因为那样会依赖到全局变量。我们采用方法2, 创建如下一个单例类:
public class MainHandler extends Handler { private static volatile MainHandler instance; public static MainHandler getInstance() { if (null == instance) { synchronized (MainHandler.class) { if (null == instance) { instance = new MainHandler(); } } } return instance; } private MainHandler() { super(Looper.getMainLooper()); }}
在子线程中,使用:
MainHandler.getInstance().post(new Runnable() { @Override public void run() { // your code }});
这样就能随时随地,很方便地将代码抛到主线程中执行。
warning, 不要耍小聪明
在子线程执行UI操作会Crash, 根据报的错,
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
有些同学可能会想,在子线程创建一个looper不就ok了吗。于是他们会在子线程的开头,调用Looper.prepare,更机智的同学甚至会在子线程的末尾进行一下Looper.loop()。
嗯, 我们会发现,这样确实不会crash了(好棒)。然而,进行的UI操作,展现的效果,会跟我们的预想出现各种各样的偏差。
不信,你可以试试。
毕竟,Google的目的,是希望我们在单一的UI线程进行UI操作,通过是否创建了looper进行判断,只是一种手段。
- 【Android】如何方便地将代码抛到主线程执行
- Android 如何判断当前代码是否在主线程中执行
- 当子线程执行完,提交到主线程执行代码(UIUtils)
- 悬而未决:FLASH中如何将所有帧的同一物体很方便地一次性一起移动到另一位置?
- C#+NLua实现将Lua代码在主线程上执行
- Swift 3.0 在主线程执行代码
- 用Handler的post()方法来传递线程中的代码段到主线程中执行
- handler底层是如何将消息从子线程发送到主线程
- java子线程全部执行完毕执行主线程代码
- Android 将信息传给主线程处理
- 黑马程序员-多线程-在android开发中经常会遇到从子线程切换到主线程,但是频繁地切换会使代码变得很臃肿,也不好维护,想请教一下各位大牛都是怎么处理的?
- Android如何执行一个不确定当前处于在子线程还是主线程中的UI操作
- 将 WebSphere Application Server Community Edition 应用程序方便地迁移到 WebSphere Application Server
- Android先执行线程池后执行主线程
- 【代码】如何快速将J2me游戏移植到Android上
- handle.post 跳到主线程中执行
- UIhelp 主线程执行
- 等待主线程结束后继续执行余下代码,
- 【3】 Android RecyclerView使用
- Android RecyclerView使用详解
- [ROS]Cartographer的初体验
- angular路由与ng-options/ng-include指令
- 2121数据结构实验之链表六:有序链表的建立
- 【Android】如何方便地将代码抛到主线程执行
- Windows下的Pycharm远程连接虚拟机中Centos下的Python环境
- runtime的使用总结
- 顺序表应用4-2:元素位置互换之逆置算法(数据改进)
- 习题8.18
- 程序控制
- 51Nod-石子归并问题(DP解法)
- 服务器控件 onclientclick和onclick区别
- 6.RecyclerView的使用(包括分割线的设置,item点击事件的监听,以及recyclorview中数据的改变)