Android基础#4:Android Handler的使用,sendMessage等方法的调用

本文详细介绍了Android系统中Handler机制的原理与应用。通过Handler,开发者可以在子线程与主线程间传递消息,避免主线程因执行耗时操作而导致UI界面无法更新的问题。文章还提供了一个具体的例子程序,演示了如何利用Handler在子线程获取时间戳,并在主线程中通过Toast显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    线程,线程,还是线程。-----箴言-----

1. Handler简介:

Handler是一种在线程之间进行消息传递的机制。

在Android系统中,当一个Android程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程。默认的情况下,所有该程序的组件都将在该进程和线程中运行。这里的主线程就是UI线程,UI线程用于更新UI界面。
一些耗时的操作如果运行再主线程,会阻塞UI线程,导致UI界面更新不了,甚至会发生ANR(Application Not Response),应用程序无响应。
这时,就需要一种机制,将这些耗时的操作放在子线程来处理,从而不会影响UI主线程。当需要将数据更新到UI线程时,子线程发消息给UI线程,由UI线程完成界面的刷新。
Android提供了Handler机制,Handler允许用户发送和处理Message(消息)。每一个Handler实例都与 一个单独的线程和该线程的消息队列相关。当创建一个新的Handler,它被绑定到创建它的线程/消息队列线程中,
而创建后的子线程是不能主动更新UI的,需要使用Handler机制返回UI主线程,由主线程来刷新UI; 

2. 使用Handler的一般步骤:

创建handler, 在handler中的handleMessage中进行消息处理,例如,更新数据到UI。
创建子线程,在子线程中处理业务逻辑,将消息通过handler发送给主线程。

3. 例子程序:

例程功能:在子线程中获取当前时间戳,在主线程中用toast来显示。

代码:



public class MainActivity extends Activity {
    private static final String TAG = "MainActivity";

    
    private Button mBtn;
    private Context mContext;
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG, "[onCreate]=========");
        setContentView(R.layout.activity_main);
        mBtn = findViewById(R.id.init_btn);
        mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startThread();
            }
        });

        mContext = this;
        
    }

    @Override
    protected void onResume() {
        super.onResume();


    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "[onDestroy]=====initOk111=======" + initOk);
    }

    private void startThread() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                long currentTime = 0l;
                for (int i = 0; i<10; i++) {
                    //do something
                    try{
                        Thread.sleep(300);
                        currentTime = System.currentTimeMillis();
                        Log.i(TAG,"[startThread]==="+currentTime);

                        Message message=new Message();
                        message.what=0;
                        message.obj=currentTime;
                        handler.sendMessage(message);

                    }catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }){

        }.start();
    }

    ////////handler define//////
    private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 0:
                    Toast.makeText(mContext,"当前时间:" + msg.obj,Toast.LENGTH_SHORT).show();
                    break;
                default:
                    break;

            }

        }
    };
}

 

运行效果:
 
说明:
在子线程中,用sleep函数进行一下阻塞,就可以看到toast提示不断更新。
 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值