package com.yifei.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button button;
private static final String TAG = "MainActivity12";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final SaleTickets2 saleTickets2 = new SaleTickets2(6);
button = findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// SaleTickets thread1 = new SaleTickets(5);
//
// thread1.start();
// try {
// thread1.join();
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// Log.d(TAG, "onClick: josin");
new Thread(saleTickets2).start();
}
});
}
private class SaleTickets extends Thread{
private int tickets=0;
public SaleTickets(int tickets){
this.tickets = tickets;
}
@Override
public void run() {
super.run();
while (tickets>0){
saletick();
}
Log.d(TAG, "卖完了");
}
private void saletick(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d(TAG, "saletick: "+tickets+"--name--"+Thread.currentThread().getName());
tickets--;
}
}
@Override
protected void onResume() {
super.onResume();
new Thread(){
@Override
public void run() {
super.run();
try {
sleep(5000);
Log.d(TAG, "run: 1");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.run();
new Thread(){
@Override
public void run() {
super.run();
try {
sleep(3000);
Log.d(TAG, "run: 2");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.run();
}
public class SaleTickets2 implements Runnable{
private int tickets =0;
@Override
public void run() {
while (tickets>0){
sole();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Log.d(TAG, "票卖完了");
}
public SaleTickets2(int tickets){
this.tickets = tickets;
}
private void sole(){
Log.d(TAG, "sole: "+tickets+Thread.currentThread().getName());
tickets--;
}
}
}
Message Queue
Handler
Looper
Message
消息循环
生成
Message msg = mHandler.obtainMessage()
msg.what = what;
msg.sendToTarget()
MessageQueue queue = mQueue;
if(queue!=null){
msg.target = this;
sent = queue.enqueueMessage(msg.uptimeMills);
}
抽取
Looper me = myLooper()'
MessageQueue queue = me.mQueue;
while(true){
Message msg = queue.next();
if(msg!=null){
if(msg.target==null){
return;
}
msg.target.dispatchMessage(msg)
msg.recycle();
}
}
线程与更新
在主线程UI线程中,如果创建了Handler时不传入Looper对象,那么将直接使用主线程(UI线程)的Looper对象, 在
其他线程里,如果创建handler时,不传入Looper对象,那么,这个Hander将不能接收处理消息,在这种情况下,通用的做法是
class LooperThread extends Thread{
public Handler mHandler;
public void run(){
Looper.prepare();
mHandler = new Handler(){
public void handleMessage(Message msg){
//process incoming messages here
}
}
Looper.loop();
}
}
在参加Hander 之前,为该线程准备好一个Looper
Handler 处理消息总是在创建Hander