2018-07-03供稿中心: 北大青鳥
在程序開發時,對于比較耗時的操作,通常會為其開辟*個單獨的線程來執行,以盡可能減少用戶的等待時間。在Android中,默認情況下,所有的操作都是在主線程中進行的,主線程負責與UI相關的事件。而在自己新建的線程中,不能對UI進行操作。因此Android提供了消息處理傳遞機制來解決這*問題。
Message,消息類。存放于MessageQueue中,包含數據類型,用戶自定義的消息代碼等。
MessageQueue,消息隊列。在MessageQueue中,存放的消息按照FIFO(先進先出)的原則執行。
Handler,消息發送類。發送或者處理Message對象到所在線程的MessageQueue中。
Looper,循環者。用來循環讀取存放于MessageQueue中的消息。*個線程對應*個Looper,*個Looper對象對應*個MessageQueue。Android中新增的線程是沒有開啟消息循環的,但是主線程除外。系統自動為主線程創建Looper對象。
*:在非主線程中創建Looper
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class LooperThread extends Thread { public Handler mHandler;//聲明*個Handler對象
public void run() { Looper.prepare(); //初始化Looper對象 mHandler = new Handler() { public void handleMessage(Message msg) { //重寫方法
// process incoming messages here } }; Message m=mHandler.obtainMessage();//獲取*個消息 m.what=0x11;設置Message的what屬性的值 mHandler.sendMessage();//發送消息 Looper.loop();//啟動Looper } } |
二:*個打地鼠游戲
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
public class MainActivity extends Activity { private int i = 0; // 記錄其打到了幾只地鼠 private ImageView mouse; // 聲明*個ImageView對象 private Handler handler; // 聲明*個Handler對象 public int[][] position = new int[][] { { 231, 325 }, { 424, 349 }, { 521, 256 }, { 543, 296 }, { 719, 245 }, { 832, 292 }, { 772, 358 } }; // 創建*個表示地鼠位置的數組
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mouse = (ImageView) findViewById(R.id.imageView1); // 獲取ImageView對象 mouse.setOnTouchListener(new OnTouchListener() {
@Override public boolean onTouch(View v, MotionEvent event) { v.setVisibility(View.INVISIBLE); // 設置地鼠不顯示 i++; Toast.makeText(MainActivity.this, "打到[ " + i + " ]只地鼠!", Toast.LENGTH_SHORT).show(); // 顯示消息提示框 return false; } });
handler = new Handler() { @Override public void handleMessage(Message msg) { int index = 0; if (msg.what == 0x101) { index = msg.arg1; // 獲取位置索引值 mouse.setX(position[index][0]); // 設置X軸位置 mouse.setY(position[index][1]); // 設置Y軸位置 mouse.setVisibility(View.VISIBLE); // 設置地鼠顯示 } super.handleMessage(msg); }
}; Thread t = new Thread(new Runnable() {
@Override public void run() { int index = 0; // 創建*個記錄地鼠位置的索引值 while (!Thread.currentThread().isInterrupted()) { index = new Random().nextInt(position.length); // 產生*個隨機數 Message m = handler.obtainMessage(); // 獲取*個Message m.what = 0x101; // 設置消息標識 m.arg1 = index; // 保存地鼠標位置的索引值 handler.sendMessage(m); // 發送消息
try { Thread.sleep(new Random().nextInt(500) + 500); // 休眠*段時間 } catch (InterruptedException e) { e.printStackTrace(); }
}
}
}); t.start(); // 開啟線程
}
} |