什么是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完整代码:

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;


public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private TextView downloadtv;
    private Button downloadbtn;
    private EditText editText;
    private TextView textView;
    int i;
    int s;
    String str;
    private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
                textView.setText(str);
            }


    };

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

        bindID();
    }

    private void bindID() {
        downloadtv=findViewById(R.id.xiazai_tv);
        downloadbtn=findViewById(R.id.xiazai_bt);
        textView=findViewById(R.id.xiazai_tv1);
        editText=findViewById(R.id.xiazai_et);
        downloadbtn.setOnClickListener(this);
    }




    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.xiazai_bt:
                String a=editText.getText().toString();
                s=Integer.valueOf(a).intValue();


                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;
                            }
                        }
                    }
                }).start();

                break;
            default:
                break;
        }
    }



}




猜你喜欢

转载自blog.csdn.net/qq_38845239/article/details/80609702