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 ...
随机推荐
- bzoj1305: [CQOI2009]dance跳舞(二分答案+网络流)
1305: [CQOI2009]dance跳舞 题目:传送门 题解: 一眼网络流基础建模...然后就GG了 二分答案+拆点建边+最大流判断: 把男女生拆为男1,男2,女1,女2 1.男1和男2还有女1 ...
- ES task管理
Task Management API The Task Management API is new and should still be considered a beta feature. Th ...
- C# 实现ADSL自动断网和拨号(适用于拨号用户)
using System;using System.Runtime.InteropServices; public struct RASCONN{ public int dwSize; p ...
- 用latex写简历
最近终于逐渐掌握了用Latex写中文简历的问题.首先就是必须基于交大前辈bin yuan的模板进行学习. 如果有了一般论文撰写和Beamer做PPT的经验,不难发现resume的模板也是遵循一套程式的 ...
- Codeforces 986B. Petr and Permutations(没想到这道2250分的题这么简单,早知道就先做了)
这题真的只能靠直觉了,我没法给出详细证明. 解题思路: 1.交换3n次或者7n+1次,一定会出现一个为奇数,另一个为偶数. 2.用最朴素的方法,将n个数字归位,计算交换次数. 3.判断交换次数是否与3 ...
- HDU 1704 Rank【传递闭包】
解题思路:给出n个选手,m场比赛,问不能判断胜负的询问最多有多少种 用传递闭包即可 但是如果直接用3重循环会超时 在判断d[i][j]=d[i][k]||d[k][j]是否连通的时候 可以加一个if语 ...
- swift语言点评十一-Methods
Assigning to self Within a Mutating Method Mutating methods can assign an entirely new instance to t ...
- RocketMQ学习笔记(8)----RocketMQ的Producer API简介
在RocketMQ中提供了三种发送消息的模式: 1.NormalProducer(普通) 2.OrderProducer(顺序) 3.TransactionProducer(事务) 下面来介绍一下pr ...
- iF.svnadmin 安装遇到的坑
iF.svnadmin 官网:http://svnadmin.insanefactory.com/ 安装配置iF.svnadmin : http://blog.linhere.com/archives ...
- ORACLE查询优化之is null和is not null优化
最近工作的时候遇到了比较大的数据查询,自己的sql在数据量小的时候没问题,在数据量达到300W的时候特别慢,只有自己优化sql了,以前没有优化过,所以记录下来自己的优化过程,本次是关于is null和 ...