为什么需要 Handler?

子线程不允许访问 UI,用Handler可以实现在子线程中修改主线程的UI,比如我在子线程中toast

 

 Handler+post实现

Handler handler=new Handler();
        new Thread(new Runnable() {
            @Override
            public void run() {
                /**
                 耗时操作
                 */
                Toast.makeText(MainActivity.this,"Starting",Toast.LENGTH_LONG).show();

                try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this,"finished",Toast.LENGTH_LONG).show();
                    }
                });
            }
        }).start();

其中Start的toast要删除,因为在子线程中不能对ui操作

Handler+sendMessage实现

    void sendMessage(){
         Handler handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what) {      //判断标志位
                    case 1:
                        /**
                         获取数据,更新UI
                         */
                        Toast.makeText(MainActivity.this,"receive:"+msg.obj,Toast.LENGTH_LONG).show();

                        msg.obj.toString();
                        break;
                }
            }
        };
         class WorkThread extends Thread {
            @Override
            public void run() {
                super.run();
                /**
                 耗时操作
                 */
                try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}

                //从全局池中返回一个message实例,避免多次创建message(如new Message)
                Message msg = Message.obtain();
                msg.obj = "data";
                msg.what=1;   //标志消息的标志
                handler.sendMessage(msg);
            }

        }
        new WorkThread().start();
    }

handler.post和handler.sendMessage本质上是没有区别的,都是发送一个消息到消息队列中,只不过post使用方式更简单

GitHub地址 下载前给star

原文地址:http://www.cnblogs.com/Frank-dev-blog/p/16850689.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性