Android子线程创建Handler方法

如果我们想在子线程上创建Handler,通过直接new的出来是会报异常的比如:

  1. new Thread(new Runnable() {  
  2.             public void run() {  
  3.                 Handler handler = new Handler(){  
  4.                     @Override  
  5.                     public void handleMessage(Message msg) {  
  6.                         Toast.makeText(getApplicationContext(), "handler msg", Toast.LENGTH_LONG).show();  
  7.                     }  
  8.                 };  
  9.                 handler.sendEmptyMessage(1);  
  10.                   
  11.             };  
  12.         }).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()咯

  1. new Thread(new Runnable() {  
  2.             public void run() {  
  3.                 Looper.prepare();  // 此处获取到当前线程的Looper,并且prepare()  
  4.                 Handler handler = new Handler(){  
  5.                     @Override  
  6.                     public void handleMessage(Message msg) {  
  7.                         Toast.makeText(getApplicationContext(), "handler msg", Toast.LENGTH_LONG).show();  
  8.                     }  
  9.                 };  
  10.                 handler.sendEmptyMessage(1);  
  11.                   
  12.             };  
  13.         }).start();  


然后我们再运行,发现不报错了,但是handleMessage内的代码没执行,因为还差重要的一步,Looper.loop();最终代码是

  1. new Thread(new Runnable() {  
  2.             public void run() {  
  3.                 Looper.prepare();  
  4.                 Handler handler = new Handler(){  
  5.                     @Override  
  6.                     public void handleMessage(Message msg) {  
  7.                         Toast.makeText(getApplicationContext(), "handler msg", Toast.LENGTH_LONG).show();  
  8.                     }  
  9.                 };  
  10.                 handler.sendEmptyMessage(1);  
  11.                 Looper.loop();  
  12.             };  
  13.         }).start();  


这样就OK了


2.方法2(获取主线程的looper,或者说是UI线程的looper)

这个方法简单粗暴,不过和上面的方法不一样的是,这个是通过主线程的looper来实现的

 

    1. new Thread(new Runnable() {  
    2.             public void run() {  
    3.                 Handler handler = new Handler(Looper.getMainLooper()){ // 区别在这!!!!  
    4.                     @Override  
    5.                     public void handleMessage(Message msg) {  
    6.                         Toast.makeText(getApplicationContext(), "handler msg", Toast.LENGTH_LONG).show();  
    7.                     }  
    8.                 };  
    9.                 handler.sendEmptyMessage(1);  
    10.             };  
    11.         }).start(); 
posted @   brave-sailor  阅读(660)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2015-06-02 JAVA ANDROID SOCKET通信检测(SERVER)连接是否断开
2015-06-02 Android Xfermode 实战 实现圆形、圆角图片
2015-06-02 Android 属性动画 源码解析 深入了解其内部实现
2015-06-02 Android 教你打造炫酷的ViewPagerIndicator 不仅仅是高仿MIUI
2015-06-02 Android Context 上下文 你必须知道的一切
2015-06-02 Android 自定义控件 优雅实现元素间的分割线 (支持3.0以下)
2015-06-02 Android SurfaceView实战 带你玩转flabby bird (下)
点击右上角即可分享
微信分享提示