Android的Handler为何物,通俗简洁版

1、定义

Handler是Android SDK中的一个类,它允许你发送和处理MessageRunnable对象与一个线程的MessageQueue关联。它主要用于两大功能:

  • 调度消息和运行在特定线程上的任务:通过使用Handler,你可以将任务排队到该Handler所关联的线程的消息队列中,任务可以是立即执行的,也可以是延迟一段时间执行的。
  • 在不同线程之间进行通信Handler允许你从一个线程向另一个线程发送消息,这是一种线程间通信(inter-thread communication)的机制。这通常用于在后台线程完成工作后更新UI(因为UI更新只能在主线程进行)。

2、举例说明 

example 1

 定时更新UI元素。这个例子展示了Handler控制线程延迟一段时间执行任务的功能假设你正在开发一个应用,需要在UI上显示一个计时器,计时器每秒钟更新一次。你可以使用Handler来实现这个功能。代码如下:

public class MyActivity extends Activity {
    private int secondsElapsed = 0;
    private TextView timerTextView;
    private Handler handler = new Handler();
    private Runnable updateTimer = new Runnable() {
        @Override
        public void run() {
            secondsElapsed++;
            timerTextView.setText("Seconds Elapsed: " + secondsElapsed);//过了几秒
            handler.postDelayed(this, 1000);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        timerTextView = findViewById(R.id.timer_text_view);
        handler.postDelayed(updateTimer, 1000);
    }
}

这边Handler的作用是确保Runnable对象每一秒执行一次,以此来更新UI元素(比如显示一个计时器)。这是通过HandlerpostDelayed(Runnable, long)方法实现的,该方法允许将一个Runnable任务延迟指定的时间后执行。

 example 2

在后台线程处理任务,然后更新UI。假设你需要在后台线程中执行一个耗时的任务,比如从网络下载数据,完成后需要更新UI显示下载的数据,即不同线程的通信功能

public class MyActivity extends Activity {
    private TextView statusTextView;
    private Handler handler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        statusTextView = findViewById(R.id.status_text_view);

        new Thread(new Runnable() {
            @Override
            public void run() {
                // 模拟耗时任务,比如下载文件
                downloadFile();
                // 下载完成后,使用Handler更新UI
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        statusTextView.setText("Download complete!");//下载完成
                    }
                });
            }
        }).start();
    }

    private void downloadFile() {
        // 这里模拟下载文件的耗时操作
        try {
            Thread.sleep(5000); // 模拟延时
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 这边解释一下handler.post(new Runnable()部分代码,post(Runnable)方法这个方法将一个Runnable任务加入到Handler所关联的线程的消息队列中。这边Handler是在主线程创建的Handler实例。因为它是在主线程创建的,所以它默认绑定到了主线程的消息队列和Looper。在这个例子中,Runnablerun方法包含更新UI组件的代码。

通过这种方式,我们实现了从一个后台线程向主线程(UI线程)发送一个任务的目的。这是因为直接从非UI线程更新UI组件是不允许的,会导致异常。使用Handler可以确保UI更新的代码在主线程上安全执行。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值