关于Android Handler

什么是Handler

Handler是Android SDK中处理异步消息的核心类。Handler的作用是让子线程通过与UI线程通信来更新UI界面。

为什么要用Handler

Android 中的一些耗时操作需要在子线程中去完成,Android 又规定访问 UI 只能在主线程中进行,在子线程中访问 UI,程序就会抛出异常。系统提供 Handler 就是为了解决在子线程中无法访问 UI 的矛盾。

什么是Looper

Looper既是有消息循环的线程,在Android里线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper,这个事android的新概念。主线程(UI线程)就是一个消息循环的线程。针对这种消息循环的机制,引入一个新的机制Handle,有消息循环,就要往消息循环里 面发送相应的消息,自定义消息一般都会有对应的处理,消息的发送和清除,消息的处理,把这些都封装在Handle里面,注意Handle只是针对那些有Looper的线程,不管是UI线程还是子线程,只要有Looper,就可以往消息队列里面添加东西,并做相应的处理。

什么是MessageQueue

MessageQueue既是“消息列队”,它内部储存了一组数据,以队列的形式提供插入和删除操作。

Handler怎么用

常用Handler来根据接收的消息,处理UI更新。Thread线程发出Handler消息,通知更新UI

Handler myHandler = new Handler() {  
          public void handleMessage(Message msg) {   
               switch (msg.what) {   
                    case TestHandler.GUIUPDATEIDENTIFIER:   
                         myBounceView.invalidate();  
                         break;   
               }   
               super.handleMessage(msg);   
          }   
     };  

另附上其他使用方法Android中Handler的使用

案例–倒计时Demo

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button dl_btn;
    private TextView dl_tv;
    private int time = 10;
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == -1) {
                dl_tv.setText("完毕");
            } else {
                dl_tv.setText(msg.what + "");
            }
        }
    };

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

    private void bindID() {
        dl_btn = findViewById(R.id.btn);
        dl_tv = findViewById(R.id.tv1);
        dl_btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn:
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        while (time > 0) {
                            handler.sendEmptyMessage(time);
                            time--;
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        handler.sendEmptyMessage(1);
                        handler.sendEmptyMessage(-1);
                    }
                }).start();
                break;
        }
    }
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="开始" />

    <TextView
        android:id="@+id/tv1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:textSize="50dp" />
</LinearLayout>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值