Handler与Message
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.arg1 == 0) {
mTv.setText("收到消息");
}
}
};
public void myClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(6000);
Message msg = new Message();
// 给消息携带信息
msg.arg1 = 0;
// 使用Handler发送消息通知主线程更新
handler.sendMessage(msg);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
单线程消息处理队列
生产者消费者模式
功能
一个线程处理所有的任务,队列中保存待处理的任务
例子: 单任务的下载
Main线程
单线程消息队列需要的角色
线程 处理消息 Thread
消息 封装信息 Message
消息队列 按顺序保存消息 MessageQueue
处理者 线程间发送消息 Handler
轮询消息队列 从消息队列中取消息给线程执行 Looper
public class MainActivity extends AppCompatActivity {
private Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initMessageQueue();
}
public void myClick(View view) {
//Message msg = new Message();
// 也可以从消息池中获取消息对象
Message msg = mHandler.obtainMessage();
msg.arg1 = new Random().nextInt(5) + 1;
// 发送消息
mHandler.sendMessage(msg);
}
private void initMessageQueue() {
//开启线程
new LooperThread().start();
}
class LooperThread extends Thread {
@Override
public void run() {
super.run();
// 创建Looper与MessageQueue
Looper.prepare();
// Handler执行在哪条线程取决于构造方法中的参数
// 如果什么都没传默认工作在创建Handler的那条线程
// Looper.myLooper()可以获得当前Looper的对象
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.e("收到消息=", msg.arg1 + "");
}
};
// 开始轮询
Looper.loop();
}
}
}