Android多线程--Handler

异步消息处理机制

  • android中不支持在子线程中修改主线程的UI,这样会导致线程不安全,这是就需要用到android中的异步消息处理机制。

Message

  • 是在线程之间传递的消息,可以在内部携带少量的信息,what、arg1和arg2用于存放整形数据,obj属性用于携带一个Object对象。

Handler

  • 就是处理者的意思,主要用于处理和发送消息,发送消息一般用Handler的sendMessage方法,而处理消息一般用其中的handleMessage方法处理。

MessageQueen

  • 消息队列的意思,主要用来存放所有通过Handler发送过来的信息,这部分消息会一直存在于消息队列中,等待被处理,每个线程中都会有一个MessageQueen对象。

Looper

  • Looper是每个线程中MessageQueen的管家,调用Looper的loop()方法,就会进入到一个无限循环当中,每当MessageQueen中发现一条信息,就会将其取出,并传递到Handler的handleMessage()方法中。每个线程中只会有一个Looper对象。

消息处理流程图

  • 消息处理流程图
    Android多线程--Handler_第1张图片
  • 示例代码如下
public class MainActivity extends AppCompatActivity {

    public static final int UPDATE_TEXT = 1;
    public static final int TIME_COUNT = 2;
    private Button button;
    private Button buttonTime;
    private TextView textView;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        buttonTime = (Button) findViewById(R.id.buttn_code);
        textView = (TextView) findViewById(R.id.textView);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        Message message = new Message();
                        message.what = UPDATE_TEXT;
                        myHandler.sendMessage(message);
                    }
                }).start();
            }
        });

        buttonTime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        int count = 10;
                        boolean isCount = true;
                        while (isCount) {
                            Message message = new Message();
                            message.what = TIME_COUNT;
                            if (count >= 0) {
                                message.obj = count + "秒后重新获取";
                                count--;
                                try {
                                    Thread.sleep(1000);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                            } else {
                                isCount = false;
                                message.obj = "获取验证码";
                            }
                            myHandler.sendMessage(message);
                        }
                    }
                }).start();
            }
        });

    }

    private Handler myHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case UPDATE_TEXT:
                    textView.setText("我改变了哦");
                    break;
                case TIME_COUNT:
                    buttonTime.setText(msg.obj + "");
            }
        }
    };
}
  • 效果图如下
    Android多线程--Handler_第2张图片

主线程向子线程发送消息

  • 一般情况下都是子线程操作主线程很少有主线程操作子线程。主线程操作子线程的方法同上,唯一的不同点就是子线程中如果创建Handler对象时,必须创建Looper,主线程自己封装了Looper,但是子线程创建Handler时,必须自己创建Looper。
  • 代码如下:
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        buttonTime = (Button) findViewById(R.id.buttn_code);
        textView = (TextView) findViewById(R.id.textView);
        button_main= (Button) findViewById(R.id.button_main);
        button_sec= (Button) findViewById(R.id.button_sec);
        button_main.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Message message=new Message();
                message.obj="我是主线程发来的消息";
                handler.sendMessage(message);
            }
        });
        button_sec.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               new Thread(new Runnable() {
                   @Override
                   public void run() {
                       Looper.prepare();
                       handler=new Handler(){
                           @Override
                           public void handleMessage(Message msg) {
                               Toast.makeText(MainActivity.this,  msg.obj+"", Toast.LENGTH_SHORT).show();
                           }
                       };
                       Looper.loop();
                   }
               }).start();
            }
        });


    }
}
  • 效果如图所示
    Android多线程--Handler_第3张图片

你可能感兴趣的:(多线程,android)