异步消息处理机制

  • 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对象。

消息处理流程图

  • 消息处理流程图
  • 示例代码如下
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 + "");            }        }    };}
  • 效果图如下

主线程向子线程发送消息

  • 一般情况下都是子线程操作主线程很少有主线程操作子线程。主线程操作子线程的方法同上,唯一的不同点就是子线程中如果创建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();            }        });    }}
  • 效果如图所示

更多相关文章

  1. [置顶] Android基于XMPP Smack Openfire开发IM(5)发送消息
  2. Handler+Message+MessageQuque+Looper 异步加载类 消息处理机制
  3. Android中桌面图标显示通知消息的数量
  4. Android学习笔记(38):Handler消息传递处理机制
  5. Android中的Handler:接受子线程发送的数据, 并用此数据配合主线
  6. Android:异步处理之Handler、Looper、MessageQueue之间的恩怨(三)
  7. Android(安卓)之 Choreographer 详细分析
  8. 【Android】实现登录、注册、数据库操作(极复杂)
  9. android中的ANR

随机推荐

  1. Android 使用LayerDrawable自定制SeekBar
  2. Android上的Native以及JNI开发(1)
  3. 【Android】 基于Socket 的即时通信软件
  4. 使用夜神模拟器进行Android开发调试
  5. Android下Entity封装工具类
  6. Android WebView 调用React Js 代码
  7. Android studio无法修改桌面的图标(已解决
  8. 使用 Jetpack Security 在 Android(安卓)
  9. android makefile and build system分析
  10. Android GUI编程模型(MVC设计模式)