多线程

多线程

为什么要用Handler

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

什么是Handler?

  • 子线程通过Handler发送消息给Message,接下来Looper把取出的消息一个个发送给 主线程。

什么是Looper?

  • 相当于一个不需要休息的工人,当Handler将消息发送到MessageQueue中时,它立马就会将发送到其中的信息取出来,一个个拿给主线程 。

什么是MessageQueue?

  • 就是一个消息队列,可以向其中添加消息并处理消息。

Handler怎么用?

  • Handler的主要工作包含消息的发送与接收过程。消息的发送通过send方法来实现。当Handler发送了消息之后,MessageQueue里就插入了一条消息,然后MessageQueue就会返回这条消息给Looper,Looper接收到消息之后就开始处理了,最终消息由Looper交给Handler处理,这时Handler就进入了处理消息的阶段,最后经过一系列的判断之后,就会调用handleMessage()方法了。
  Handler handler=new Handler(){
               @Override
               public void handleMessage(Message msg) {
                   super.handleMessage(msg);
                   if (msg.what==-1){
                       tvdown.setText("倒计时结束");
                   }else
                   tvdown.setText(msg.what+"");
               }
           };
      new Thread(new Runnable() {
                     @Override
                     public void run() {
                         try {
                             while (cunt>0) {
                                 Thread.sleep(1000);
                                 cunt--;

                                 handler.sendEmptyMessage(cunt);
                             }
                         } catch (InterruptedException e) {
                             e.printStackTrace();
                         }

                     }
                 }).start();

案例分析-倒计时Demo

public class downActivity extends AppCompatActivity implements View.OnClickListener{
          TextView tvdown;
           Button btdown;
           EditText edtime;
           int cunt=10;

           Handler handler=new Handler(){
               @Override
               public void handleMessage(Message msg) {
                   super.handleMessage(msg);

                   if (msg.what==-1){
                       tvdown.setText("倒计时结束");
                   }else
                   tvdown.setText(msg.what+"");
               }
           };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_down);
        tvdown=findViewById(R.id.tv_down);
        btdown=findViewById(R.id.bt_downlad);
        edtime=findViewById(R.id.et_time);
        btdown.setOnClickListener(this);

    }
       //子线程通过Handler发送消息给Mansege looper一个个把取出的消息发送给 主线程
    @Override
    public void onClick(View view) {
         switch (view.getId()){
             case  R.id.bt_downlad:
                 new Thread(new Runnable() {
                     @Override
                     public void run() {
                         try {
                             while (cunt>0) {
                                 Thread.sleep(1000);
                                 cunt--;

                                 handler.sendEmptyMessage(cunt);
                             }
                         } catch (InterruptedException e) {
                             e.printStackTrace();
                         }

                     }
                 }).start();
                 break;
                 default:
                  break;
         }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值