Android子线程创建Handler方法
如果我们想在子线程上创建Handler,通过直接new的出来是会报异常的比如:
- new Thread(new Runnable() {
- public void run() {
- Handler handler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- Toast.makeText(getApplicationContext(), "handler msg", Toast.LENGTH_LONG).show();
- }
- };
- handler.sendEmptyMessage(1);
- };
- }).start();
会报错:
01-12 02:49:31.814: E/AndroidRuntime(2226): Java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
1.方法1(直接获取当前子线程的looper)
既然它说要 Looper.prepare(),那我们就给他prepare()咯
- new Thread(new Runnable() {
- public void run() {
- Looper.prepare(); // 此处获取到当前线程的Looper,并且prepare()
- Handler handler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- Toast.makeText(getApplicationContext(), "handler msg", Toast.LENGTH_LONG).show();
- }
- };
- handler.sendEmptyMessage(1);
- };
- }).start();
然后我们再运行,发现不报错了,但是handleMessage内的代码没执行,因为还差重要的一步,Looper.loop();最终代码是
- new Thread(new Runnable() {
- public void run() {
- Looper.prepare();
- Handler handler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- Toast.makeText(getApplicationContext(), "handler msg", Toast.LENGTH_LONG).show();
- }
- };
- handler.sendEmptyMessage(1);
- Looper.loop();
- };
- }).start();
这样就OK了
2.方法2(获取主线程的looper,或者说是UI线程的looper)
这个方法简单粗暴,不过和上面的方法不一样的是,这个是通过主线程的looper来实现的
- new Thread(new Runnable() {
- public void run() {
- Handler handler = new Handler(Looper.getMainLooper()){ // 区别在这!!!!
- @Override
- public void handleMessage(Message msg) {
- Toast.makeText(getApplicationContext(), "handler msg", Toast.LENGTH_LONG).show();
- }
- };
- handler.sendEmptyMessage(1);
- };
- }).start();
Android子线程创建Handler方法的更多相关文章
- Android子线程更新UI主线程方法之Handler
背景: 我们开发应用程序的时候,处于线程安全的原因子线程通常是不能直接更新主线程(UI线程)中的UI元素的,那么在Android开发中有几种方法解决这个问题,其中方法之一就是利用Handler处理的. ...
- Android子线程更新UI的方法总结
版权声明:本文为博主原创文章,转载请注明出处:https://i.cnblogs.com/EditPosts.aspx?postid=6121280 消息机制,对于Android开发者来说,应该是非常 ...
- Android子线程真的不能更新UI么
Android单线程模型是这样描述的: Android UI操作并不是线程安全的,并且这些操作必须在UI线程执行 如果在其它线程访问UI线程,Android提供了以下的方式: Activity.run ...
- android子线程更新UI
参考:https://www.cnblogs.com/joy99/p/6121280.html 子线程是不能直接更新UI的.Android实现View更新有两组方法,分别是invalidate和pos ...
- Android 子线程 UI 操作真的不可以?
作者:vivo 互联网大前端团队- Zhang Xichen 一.背景及问题 某 SDK 有 PopupWindow 弹窗及动效,由于业务场景要求,对于 App 而言,SDK 的弹窗弹出时机具有随机性 ...
- Android子线程更新UI成功
android子线程更新UI成功 今天在写demo的时候,在子线程中更新UI,发现更新成功,记录一下. protected void onCreate(Bundle savedInstanceStat ...
- (原)Android在子线程用handler发送的消息,主线程是怎么loop到的?
来自知乎:https://www.zhihu.com/question/48130951?sort=created 大家都知道Android的Looper是ThreadLocal方式实现,每个线程 ...
- 老问题:Android子线程中更新UI的3种方法
在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 方法一:用Handler 1.主线程中定义Handler: Handle ...
- Android子线程中更新UI的4种方法
方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage ...
随机推荐
- HDU 4305 Contest 1
感觉是有很多细节要处理的.尤其是求逆元后的运算,应该是存在超范围的情况的. #include <iostream> #include <cstdio> #include < ...
- POJ 1715
同样是确定某位上的数,当确定某一位后,其后面的排列数是确定的,所以可以用除法和取余数的方法来确定这一位的值 #include <iostream> #include <cstdio& ...
- linux定时备份mysql数据库文件
1.设定定时器:终端敲入:crontab -e命令 2,然后写入 00 23 * * * /home/db_bak_file/dbbak.sh >>/home/db_bak_fil ...
- node--19 moogose demo1
db.js /** * Created by Danny on 2015/9/28 16:44. */ //引包 var mongoose = require('mongoose'); //创建数据库 ...
- Redis和Memcache和MongoDB简介及区别分析(整理)
Redis和Memcache 一.Redis简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年 ...
- nyoj--1239--引水工程(最小生成树)
引水工程 时间限制:2000 ms | 内存限制:65535 KB 难度: 描述 南水北调工程是优化水资源配置.促进区域协调发展的基础性工程,是新中国成立以来投资额最大.涉及面最广的战略性工程,事 ...
- Oracle RAC 实施
第 1 步 — 确定项目范围 理由 我们实施 Oracle RAC 是为了使我们的应用程序可伸缩和高度可用,以及为我们的客户提供更可靠的服务. 目标/可交付产品 该项目的最终产品将是一个新的 Orac ...
- CENTOS修改操作系统字符集
[root@localhost sysconfig]# cd /etc/sysconfig/ [root@localhost sysconfig]# vi i18n 修改并保存退出(:wq) LANG ...
- RAC IP 地址修改
RAC 修改IP: 版本信息: REDHAT AS5 ORACLE 11G R2, 两个节点. 修改如下: 1.修改/etc/host(rac1,rac2) 192.168.3.205 rac-s ...
- autocomplete="off" 不起作用解决方案
autocomplete属性是表单字段中的HTML5新属性,该属性有两种状态值,分别为"on" 和 "off",该属性可省略:省略属性值后默认值为"o ...