手记

什么是Handler

为什么要使用Handler?

在线程中,主线程用于更新UI,而子线程并不能更新UI,但是主线程又不能进行耗时操作,由此,Handler的作用在这里体现出来了,通过使用Handler完成主线程和子线程信息的传递,从而达到效果;


什么是Handler

Handler是Android SDK中处理异步类消息的核心类,其作用是让子线程通过与UI通信来更新UI界面 
总结起来也可以这样说: 
1.当应用程序启动时,会初始化一个UI线程 
2.UI线程中创建了Looper,所以是一个循环工作线程 
3.创建Looper时,Looper会创建一个MessageQueue 

4.UI中的Looper会不断从MessageQueue中取出消息



什么是Looper?什么是MessageQueue?

 Looper是一个取出消息的人,而MessageQueue则是放置消息的一个箱子。

要点  1:在Androidz中创建出普通线程默认是没有消息循环的,run方法执行完毕,线程也就结束。

         2:如果让线程不停的循环工作,可以使用Looper,将普通线程变成循环工作线程。

         3:当创建Looper时,将会自动创建出MessageQueue。

         4:一个线程中只会存在一个Looper和一个MessageQueue。

         5:当MessageQueue中有消息时,Looper将从MessageQueue中取出消息。


Handler怎么用?

举个倒计时的例子:

MainActivity代码:

new Thread(new Runnable() {
                    @Override
                    public void run() {
                        for (i=s;i>=0;i--){
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            str = Integer.toString(i);
                            handler.sendEmptyMessage(1);

                       /* runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                            }
                        });*/
                            if(i==0){
                                break;

用一个MessageQueue来接收

 private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
                textView.setText(str);
            }


    };



案例解析——倒计时Demo

子线程完成工作之后通过Handle发送消息到MessageQueue里面,Looper将消息取出给主线程处理

MainActivity完整代码:

  1. import android.os.Handler;  

  2. import android.os.Message;  

  3. import android.support.v7.app.AppCompatActivity;  

  4. import android.os.Bundle;  

  5. import android.text.Editable;  

  6. import android.view.View;  

  7. import android.widget.Button;  

  8. import android.widget.EditText;  

  9. import android.widget.TextView;  

  10.   

  11.   

  12. public class MainActivity extends AppCompatActivity implements View.OnClickListener{  

  13.     private TextView downloadtv;  

  14.     private Button downloadbtn;  

  15.     private EditText editText;  

  16.     private TextView textView;  

  17.     int i;  

  18.     int s;  

  19.     String str;  

  20.     private Handler handler=new Handler(){  

  21.         @Override  

  22.         public void handleMessage(Message msg) {  

  23.             super.handleMessage(msg);  

  24.                 textView.setText(str);  

  25.             }  

  26.   

  27.   

  28.     };  

  29.   

  30.     @Override  

  31.     protected void onCreate(Bundle savedInstanceState) {  

  32.         super.onCreate(savedInstanceState);  

  33.         setContentView(R.layout.activity_main);  

  34.   

  35.         bindID();  

  36.     }  

  37.   

  38.     private void bindID() {  

  39.         downloadtv=findViewById(R.id.xiazai_tv);  

  40.         downloadbtn=findViewById(R.id.xiazai_bt);  

  41.         textView=findViewById(R.id.xiazai_tv1);  

  42.         editText=findViewById(R.id.xiazai_et);  

  43.         downloadbtn.setOnClickListener(this);  

  44.     }  

  45.   

  46.   

  47.   

  48.   

  49.     @Override  

  50.     public void onClick(View v) {  

  51.         switch (v.getId()){  

  52.             case R.id.xiazai_bt:  

  53.                 String a=editText.getText().toString();  

  54.                 s=Integer.valueOf(a).intValue();  

  55.   

  56.   

  57.                 new Thread(new Runnable() {  

  58.                     @Override  

  59.                     public void run() {  

  60.                         for (i=s;i>=0;i--){  

  61.                             try {  

  62.                                 Thread.sleep(1000);  

  63.                             } catch (InterruptedException e) {  

  64.                                 e.printStackTrace();  

  65.                             }  

  66.                             str = Integer.toString(i);  

  67.                             handler.sendEmptyMessage(1);  

  68.   

  69.                        /* runOnUiThread(new Runnable() {  

  70.                             @Override  

  71.                             public void run() {  

  72.                             }  

  73.                         });*/  

  74.                             if(i==0){  

  75.                                 break;  

  76.                             }  

  77.                         }  

  78.                     }  

  79.                 }).start();  

  80.   

  81.                 break;  

  82.             default:  

  83.                 break;  

  84.         }  

  85.     }  

  86.   

  87.   

  88.   

  89. }  

    原文出处


0人推荐
随时随地看视频
慕课网APP