Android多线程--Handler
16lz
2021-01-24
异步消息处理机制
- 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(); } }); }}
- 效果如图所示
更多相关文章
- [置顶] Android基于XMPP Smack Openfire开发IM(5)发送消息
- Handler+Message+MessageQuque+Looper 异步加载类 消息处理机制
- Android中桌面图标显示通知消息的数量
- Android学习笔记(38):Handler消息传递处理机制
- Android中的Handler:接受子线程发送的数据, 并用此数据配合主线
- Android:异步处理之Handler、Looper、MessageQueue之间的恩怨(三)
- Android(安卓)之 Choreographer 详细分析
- 【Android】实现登录、注册、数据库操作(极复杂)
- android中的ANR