如果我们想在子线程上创建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. }).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. }).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();

Android子线程创建Handler方法的更多相关文章

  1. Android子线程更新UI主线程方法之Handler

    背景: 我们开发应用程序的时候,处于线程安全的原因子线程通常是不能直接更新主线程(UI线程)中的UI元素的,那么在Android开发中有几种方法解决这个问题,其中方法之一就是利用Handler处理的. ...

  2. Android子线程更新UI的方法总结

    版权声明:本文为博主原创文章,转载请注明出处:https://i.cnblogs.com/EditPosts.aspx?postid=6121280 消息机制,对于Android开发者来说,应该是非常 ...

  3. Android子线程真的不能更新UI么

    Android单线程模型是这样描述的: Android UI操作并不是线程安全的,并且这些操作必须在UI线程执行 如果在其它线程访问UI线程,Android提供了以下的方式: Activity.run ...

  4. android子线程更新UI

    参考:https://www.cnblogs.com/joy99/p/6121280.html 子线程是不能直接更新UI的.Android实现View更新有两组方法,分别是invalidate和pos ...

  5. Android 子线程 UI 操作真的不可以?

    作者:vivo 互联网大前端团队- Zhang Xichen 一.背景及问题 某 SDK 有 PopupWindow 弹窗及动效,由于业务场景要求,对于 App 而言,SDK 的弹窗弹出时机具有随机性 ...

  6. Android子线程更新UI成功

    android子线程更新UI成功 今天在写demo的时候,在子线程中更新UI,发现更新成功,记录一下. protected void onCreate(Bundle savedInstanceStat ...

  7. (原)Android在子线程用handler发送的消息,主线程是怎么loop到的?

    来自知乎:https://www.zhihu.com/question/48130951?sort=created   大家都知道Android的Looper是ThreadLocal方式实现,每个线程 ...

  8. 老问题:Android子线程中更新UI的3种方法

    在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 方法一:用Handler 1.主线程中定义Handler: Handle ...

  9. Android子线程中更新UI的4种方法

    方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage ...

随机推荐

  1. SQL SERVER-约束

    NOT NULL - 指示某列不能存储 NULL 值. UNIQUE - 保证某列的每行必须有唯一的值. PRIMARY KEY - NOT NULL 和 UNIQUE 的结合.确保某列(或两个列多个 ...

  2. java string遇到的一个奇葩bug

    String abc = "1"; HashMap<String, String> hMap = new HashMap<String, String>() ...

  3. 玩转oracle学习第六天

     1.上节回想 2.PL/SQL的介绍 3.PL/SQL的基础 理解oracle的pl/sql概念 掌握PL/SQL编程技术(包含编写过程,函数,触发器.包... ) PL/SQL是什么? PL/ ...

  4. Oracle在更改机器名后服务无法启动的解决方法

    Oracle改变机器名后会导致服务无法正常启动,能够通过下列操作解决: 1.oracle\product\10.2.0\db_3\network\ADMIN文件夹下,listener.ora文件里的L ...

  5. ruby on rails错误undefined method `title&#39; for nil:NilClass

    首先搞清楚这句话,在 Ruby 中,方法分为 public.private 和 protected 三种,仅仅有 public 方法才干作为控制器的动作. 我的出错的代码例如以下: controlle ...

  6. IIS身份验证的配置

    前4者配置:localhost applicationHost.config <location path=""> 后2者配置:web.config 要点: 这6项尽管 ...

  7. [JZOJ 100026] [NOIP2017提高A组模拟7.7] 图 解题报告 (倍增)

    题目链接: http://172.16.0.132/senior/#main/show/100026 题目: 有一个$n$个点$n$条边的有向图,每条边为$<i,f(i),w(i)>$,意 ...

  8. mysql实战45讲读书笔记(二) 一条SQL更新语句是如何执行的 极客时间

    前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块.相信你还记得,一条查询语句的执行过程一般是经过连接器.分析器.优化器.执行器等功能模块,最后到达存储引擎. 那么,一条更新语 ...

  9. xBIM 基础15 IFC导出Excel报表

    系列目录    [已更新最新开发文章,点击查看详细]  IFC导出Excel空间报表文件 本篇将向您展示从IFC文件读取数据所需的一些概念.它使用IFC4接口,适用于IFC2x3和IFC4型号.要创建 ...

  10. Eclipse中將Java项目转变为Java Web项目

    1.在项目上点击右键=>properties,在Project Facets配置项中,勾选Dynamic Web Module.Java.JavaScript选项. 2.用记事本打开项目目录下的 ...