Handler使用方法详解(含实例)

0、目录

一、相关概念简介

二、使用方式

三、使用步骤

四、实例讲解

五、总结

一、相关概念简介

Handler是一套消息传递机制,通常的作用是在多线程的应用场景中,将子线程(工作线程)中需要更新UI的相关信息传递到主线程,从而实现工作线程对UI的更新。

二、使用方式

Handler的使用方式可以根据发送消息的方式不同而分为两种:

Handler.sendMessage()和Handler.post()

三、使用步骤

方式一,使用Handler.sendMessage()

在该使用方式中,因创建Handler的方式不同,又可分两种:创建Handler子类、使用匿名Handler内部类,但本质都是相同的,都是继承Handler类创建子类

一,创建Handler子类
1、自定义Handler子类,并重写handleMessage()方法
    class mHandler extends Handler {
       //重写handleMessage()方法
         @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //执行的UI操作 
        }
    }
2、主线程中创建mHandler的实例
    private mHandler mhandler = new mHandler();
3、在子线程中创建需要发送的消息对象
    Message msg = Message.obtain();
    msg.what = 1;
4、在子线程中通过Hander发送消息到消息队列
    mhandler .sendMessage(msg);
5、启动子线程

二、使用匿名Handler子类
1、在主线程中通过匿名内部类创建Handler类对象
    Handler mhandler =  new Handler(){
        //重写handleMessage()方法
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //执行的UI操作 
        }
    };
2、在子线程中创建需要发送的消息对象
    Message msg = Message.obtain();
    msg.what = 1;
3、在子线程中通过Hander发送消息到消息队列
    mhandler .sendMessage(msg);
4、启动子线程

 

方式二、使用Handler.post()方法

1、在主线程中创建Handler实例
    private Handler mhandler = new Handler();
2、在子线程中使用Handler.post()
     mhandler.post(new Runnable() {
                                @Override
                            public void run() {
                                 //执行的UI操作 
                            }
                        });
3、启动子线程

四、使用实例

方式一,使用Handler.sendMessage()

一,创建Handler子类

 

public class MainActivity extends AppCompatActivity {
    TextView mTxtShowTest;
    Button mBtn1, mBtn2, mBtn3;
    // 2、在主线程中创建自定义Handler(mHandler)的实例
    private mHandler mhandler = new mHandler();
     
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTxtShowTest = (TextView) findViewById(R.id.mTxtShowTest);
        mBtn1 = (Button) findViewById(R.id.mBtn1); 

        mBtn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                    // 3、创建所需消息对象
                        Message msg = Message.obtain();
                        msg.what = 1;

                        //4、发送消息
                        mhandler.sendMessage(msg);
                    }
                    // 5、开启线程
                }).start();
            }
        }); 
    }

    //1、自定义Handler子类,继承Handler,重写handleMessage()方法
    class mHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //执行的UI操作
            mTxtShowTest.setText("新建Handler子类方法");
        }
    }
}

二、使用匿名Handler子类

public class MainActivity extends AppCompatActivity {
    TextView mTxtShowTest;
    Button mBtn1, mBtn2, mBtn3;
    //1、在主线程中通过匿名内部类创建Handler类对象
    private Handler mhandler2 =  new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //执行的UI操作
            mTxtShowTest.setText("匿名内部类方法");
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTxtShowTest = (TextView) findViewById(R.id.mTxtShowTest); 
        mBtn2 = (Button) findViewById(R.id.mBtn2);  

        mBtn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                     // 2、创建所需消息对象
                        Message msg = Message.obtain();
                        msg.what = 1;

                        //3、发送消息
                        mhandler2.sendMessage(msg);
                    }
                //4、开启线程
                }).start();
            }
        }); 
    } 
}

方式二、使用Handler.post()方法

public class MainActivity extends AppCompatActivity {
    TextView mTxtShowTest;
    Button mBtn1, mBtn2, mBtn3;
    //1、在主线程中创建Handler的实例 
    private Handler mhandlerPost = new Handler(); 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTxtShowTest = (TextView) findViewById(R.id.mTxtShowTest); 
        mBtn3 = (Button) findViewById(R.id.mBtn3); 

        mBtn3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        //2、在子线程中使用Handler.post()
                        mhandlerPost.post(new Runnable() {
                            @Override
                            public void run() {
 				//执行的UI操作
                                mTxtShowTest.setText("post方法");
                            }
                        });
                    }
                //4、开启线程
                }).start();
            }
        });  
    } 
}

 

五、总结

本问主要介绍了Handler的使用方法,后面将继续介绍Handler的原理和源码分析。

参考:https://www.jianshu.com/p/f0b23ee5a922

 

 

 

 

  • 15
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值