自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

對于Android工作線程進(jìn)行全解析

移動開發(fā) Android
Android工作線程工作原理為:主要是為了節(jié)約CPU時間,發(fā)揮利用,根據(jù)具體情況而定. 線程的運行中需要使用計算機(jī)的內(nèi)存資源和CPU。

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

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

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

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

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

下面就是LunaThread這個Android工作線程的執(zhí)行函數(shù)了,它一直不斷在重復(fù)做一件事情:鎖定待繪制區(qū)域(這里是整個屏幕),若游戲還在進(jìn)行狀態(tài),則更新底層的數(shù)據(jù),然后直接強(qiáng)制界面重新繪制。

  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的暫停其實并沒有不再強(qiáng)制重繪制,而是沒有對底層的數(shù)據(jù)做任何修改,依然繪制同一幀畫面,而繼續(xù)則是把mLastTime設(shè)置為當(dāng)前時間+100毫秒的時間點,因為以前暫停時mLastTime就不再更新了,這樣做事為了與當(dāng)前時間同步起來。

責(zé)任編輯:chenqingxiang 來源: 計世網(wǎng)
相關(guān)推薦

2010-02-06 10:42:41

Android Ser生命周期

2010-02-23 16:46:27

Python設(shè)計語言

2010-02-05 14:34:11

Android操作系統(tǒng)

2010-02-06 10:14:36

Android Act

2010-03-03 14:51:02

Android手機(jī)

2009-12-07 09:58:35

WCF性能

2010-02-02 13:32:32

Python繼承

2010-03-04 16:38:37

Android開發(fā)技巧

2010-02-07 10:21:27

Android應(yīng)用程序

2010-02-06 16:26:30

Android開源

2010-02-04 14:16:45

Android平臺

2010-02-22 10:18:29

Python代碼

2010-03-01 14:28:46

Python進(jìn)程

2010-03-04 17:50:42

Android操作系統(tǒng)

2016-12-02 19:00:13

Android FraAndroid

2010-03-01 13:19:21

Python線程內(nèi)容

2009-12-01 17:55:11

VS2003配置

2010-02-06 09:38:42

Android調(diào)用服務(wù)

2010-03-02 15:51:05

Android手機(jī)

2010-02-06 17:17:17

Android手機(jī)
點贊
收藏

51CTO技術(shù)棧公眾號