Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 高級開發 >> 對於Android工作線程進行全解析

對於Android工作線程進行全解析

編輯:高級開發

android工作線程程序中一個單一的順序控制流程.在單個程序中同時運行多個線程完成不同的工作,這些內容都是一些門戶網站和技術論壇找到的,中間可能有不少錯誤是我沒有挑出的,歡迎大家指正。

由於SurfaceHolder是一個共享資源,因此在對其操作時都應該實行“互斥操作“,即需要使用synchronized進行”封鎖“機制。再來討論下為什麼要使用消息機制來更新界面的文字信息呢?其實原因是這樣的。

渲染文字的工作實際上是主線程(也就是LunarView類)的父類VIEw的工作。而並不屬於android工作線程LunarThread,因此在android工作線程中式無法控制的。所以我們改為向主線程發送一個Message來代替。

讓主線程通過Handler對接收到的消息進行處理,從而更新界面文字信息。再回顧上一篇SnakeView裡的文字信息更新,由於是SnakeVIEw自己(就這一個線程)對其包含的TextVIEw做控制,當然沒有這樣的問題了。

  1. public void run()
  2. {
  3. while (mRun)
  4. {
  5. Canvas c = null;
  6. try
  7. {
  8. //鎖定待繪制區域
  9. c = mSurfaceHolder.lockCanvas(null);
  10. synchronized (mSurfaceHolder)
  11. {
  12. if (mMode == STATE_RUNNING)
  13. updatePhysics();//更新底層數據,判斷游戲狀態
  14. doDraw(c);//強制重繪制
  15. }
  16. }
  17. finally
  18. {
  19. if (c != null) {
  20. mSurfaceHolder.unlockCanvasAndPost(c);
  21. }
  22. }
  23. }
  24. }

下面就是LunaThread這個android工作線程的執行函數了,它一直不斷在重復做一件事情:鎖定待繪制區域(這裡是整個屏幕),若游戲還在進行狀態,則更新底層的數據,然後直接強制界面重新繪制。

  1. canvas.save();
  2. canvas.rotate((float) mHeading, (float) mX, mCanvasHeight
  3. - (float) mY);
  4. if (mMode == STATE_LOSE) {
  5. mCrashedImage.setBounds(xLeft, yTop, xLeft + mLanderWidth, yTop
  6. + mLanderHeight);
  7. mCrashedImage.draw(canvas);
  8. } else if (mEngineFiring) {
  9. mFiringImage.setBounds(xLeft, yTop, xLeft + mLanderWidth, yTop
  10. + mLanderHeight);
  11. mFiringImage.draw(canvas);
  12. } else {
  13. mLanderImage.setBounds(xLeft, yTop, xLeft + mLanderWidth, yTop
  14. + mLanderHeight);
  15. mLanderImage.draw(canvas);
  16. }
  17. canvas.restore();

LunarLancher的暫停其實並沒有不再強制重繪制,而是沒有對底層的數據做任何修改,依然繪制同一幀畫面,而繼續則是把mLastTime設置為當前時間+100毫秒的時間點,因為以前暫停時mLastTime就不再更新了,這樣做事為了與當前時間同步起來。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved