Handler的使用

Handler通信工作原理

Android中为了UI操作线程安全,只允许UI线程更新Activity里的UI组件。
工作线程操作UI的消息传递到主线程,主线程根据工作线程的需求更新UI,保证线程安全。

Handler工作流程解析

1.异步通信准备

在主线程中创建:

处理器对象Looper
消息队列对象Message Queue,Looper则自动进入消息循环,Handler自动绑定主线程的Looper、MessageQueue
Handler对象

2.消息发送

工作线程(子线程)通过Handler发送消息(Message)到消息队列(Message Queue)中。

3.消息循环

消息出队:Looper循环取出Message Queue中的Message;
消息分发:Looper将取出的Message发送创建该Message的处理者Handler;

在消息循环过程中,若消息队列为空,则线程阻塞。

4.消息处理

Handler接收Looper发过来的Message;

Handler根据Message进行UI操作;

注意的知识点

  • 一个线程(Thread)只能绑定一个循环器(Looper),但可以有多个处理者(Handler);
  • 一个循环器(Looper)可以绑定多个处理者(Handler);
  • 一个处理者(Handler)只能绑定一个循环器(Looper);

Handler的两种方式

方式一:Handler.sendMessage()

private static final int UPDATE_TEXT = 1;

//创建Handler函数

private Handler handler = new Handler(){

    public void handleMessage(Message msg){
        switch(msg.what){
            case UPDATE_TEXT:
                //进行UI更新
                break;
            default:
                break;
        }
    }
}

创建线程发送消息

new Thread(new Runnable(){
    @Override
    public void run(){
        Message message = new Message();//实例化消息对象
        message.what=UPDATE_TEXT;//消息标识
        handler.sendMessage(message);//发送message
    }
}).start();

方式二:Handler.post()

 private Handler handler = new Handler();
 
   new Thread(new Runnable(){
                   @Override
                   public void run(){

                       handler.post(new Runnable(){
                           @Override
                           public void run(){
                              //更新UI逻辑
                           }
                       });
                   }
               }).start();

举个栗子

方式一:Handler.sendMessage()

public class MainActivity extends AppCompatActivity{

    private static String TAG = "MainActivity";
    private static final int UPDATE_TEXT = 1;
    private TextView handlerText;

    private Button handlerButton;

    private  Handler handler = new Handler(){
        public void handleMessage(Message msg){
            switch(msg.what){
                case UPDATE_TEXT:
                    handlerText.setText("You Are Handler");
                    Log.i(TAG, "handleMessage: "+handlerText.getText().toString());
                    break;
                default:
                    break;
            }
        }
    };

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        handlerText =(TextView)findViewById(R.id.handler_text);
        handlerButton = (Button)findViewById(R.id.handler_button);
       handlerButton.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               //启动线程发送Message
               new Thread(new Runnable(){
                   @Override
                   public void run(){
                       Message message = new Message();
                       message.what=UPDATE_TEXT;
                       handler.sendMessage(message);
                   }
               }).start();
           }
       });

    }



}

方式二:Handler.post()

public class MainActivity extends AppCompatActivity{

    private static String TAG = "MainActivity";

    private TextView handlerText;

    private Button handlerButton;

    private Handler handler = new Handler();



    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        handlerText =(TextView)findViewById(R.id.handler_text);
        handlerButton = (Button)findViewById(R.id.handler_button);
       handlerButton.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               //启动线程发送Message
               new Thread(new Runnable(){
                   @Override
                   public void run(){

                       handler.post(new Runnable(){
                           @Override
                           public void run(){
                               handlerText.setText("You Are Handler");
                    Log.i(TAG, "handleMessage: "+handlerText.getText().toString());
                           }
                       });
                   }
               }).start();
           }
       });

    }
    
}

你可能感兴趣的:(Handler的使用)