国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > 建站經驗 > 正文

Android:多線程_之進程與線程

2019-11-02 15:20:40
字體:
來源:轉載
供稿:網友

 進程與線程

  一般來說,Android中為一個應用程序開啟一個進程進行執(zhí)行,在這個應用程序中的所有組件,通過單獨的線程進行執(zhí)行,而其中所有的線程,共享該應用程序進程的資源。當一個應用程序啟動的時候,Android系統(tǒng)啟動一個新的Linux應用程序的進程和一個執(zhí)行線程。默認情況下,一個應用程序運行中的所有組件運行在相同的進程和線程中,這里的線程一般稱為主線程。如果一個應用程序的組件開始的時候,已經存在一個進程,那么應用程序會在與它相同的執(zhí)行線程中開始這個組件。

進程

  默認情況下,同一應用程序下的所有組件運行在同一進程中,大多數應用程序不應該改變這個。然而,如果需要控制那個進程屬于那個組件,可以在AndroidManifest.xml文件中進行配置。一般來說,組件元素:<activity>、<service>、<receiver>、<provider>均支持一個android:process屬性,可以設置這個屬性讓不同的組件單獨運行在自己的進程中,也可以使用這個屬性使不同的應用程序組件運行在相同的進程中,并共享相同的Linux用戶ID和賦予同樣的證書。

  Tips:<application>元素也支持android:process屬性,用于設置所有的組件。

  Android在內存較低的情況下,會關閉一些優(yōu)先級較低的進程以增大內存運行更重要的進程,而在這個進程中的所有線程,也會被同時銷毀。在內存足夠的情況下,Android系統(tǒng)會視圖盡可能保持應用程序進程,以達到下次的運行的快速啟動,但最終需要移除舊的進程,回收內存用于新的或更重要的進程。通過進程的優(yōu)先級來判斷是否被回收,一般會回收優(yōu)先級低的進程,以給優(yōu)先級高的進程騰出資源。

  下面是五類Android進程,他們的優(yōu)先級順序排列:

Foreground process:前臺進程。 Visible prcess:可見進程。 Service process:服務進程。 Background process:后臺進程。 Empty process:空進程。

  Tips:一個進程的優(yōu)先級是可以變化的。

 

線程

  當應用程序啟動時,系統(tǒng)會創(chuàng)建一個執(zhí)行線程在這個應用程序的的進程中,一般被稱為“主線程”。這個線程是非常重要的,因為它負責把事件分發(fā)給響應的用戶組件,包括繪制事件等,因此主線程又被稱為UI線程。系統(tǒng)并不會為每個組件創(chuàng)建一個單獨的線程,而是在UI線程中,完成這些組件的初始化的,因此系統(tǒng)回調方法是運行在UI線程中,如click事件。

  當程序執(zhí)行比較復雜的工作來應對用戶交互的時候,哪怕應用程序被正確的執(zhí)行了,單線程模式也可能會導致運行性能很低下。舉例來說,如果一切的應用功能都發(fā)生在UI線程中,當執(zhí)行耗時操作的時候,如訪問網絡或查詢數據,均會阻塞UI先,將導致其他的事件不被分發(fā)到事件隊列中,包括屏幕繪制事件。導致從用戶的角度來看,應用程序死掉了。而在Android系統(tǒng)中,當UI線程被阻塞超過幾秒鐘(大約是5秒)的時候,會彈出“應用程序沒有響應”的對話框,造成用戶體驗差,可能會迫使用戶決定退出你的應用或者干脆直接卸載它。

  此外,Android的UI ToolKit包下的所有組件都不是線程安全的,所以,不能在一個單獨的工作線程中操作這些UI組件,必須在UI線程中操作。因此,對于單線程模型,Android有兩個規(guī)則:

不能阻塞UI線程 不能在工作線程中訪問Android UI ToolKit包下的組件。

  對于耗時的操作,應該放在單獨的線程中。例如:下面通過一個Demo監(jiān)聽按鈕點擊事件,下載一個圖片,從單獨的線程中,并顯示在一個ImageView中。

 1         btnError2.setOnClickListener(new View.OnClickListener() {             2             @Override 3             public void onClick(View v) { 4                 // 增加一個線程訪問網絡 5                 new Thread(new Runnable() { 6                     @Override 7                     public void run() { 8                         // 獲取地址下的圖片 9                         Bitmap btm=loadImageFromNetwork("http://ww4.sinaimg.cn/bmiddle/786013a5jw1e7akotp4bcj20c80i3aao.jpg");10                         imageView1.setImageBitmap(btm);                        11                     }12                 }).start();13                 14             }15         });
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 五峰| 南靖县| 永胜县| 上饶县| 太湖县| 中宁县| 晋城| 鲜城| 广南县| 邮箱| 来安县| 高州市| 萝北县| 聂荣县| 武邑县| 尤溪县| 星子县| 襄垣县| 青海省| 浠水县| 蛟河市| 体育| 紫金县| 广饶县| 正宁县| 驻马店市| 洛扎县| 前郭尔| 垣曲县| 札达县| 葫芦岛市| 黎川县| 柳林县| 延边| 德保县| 五大连池市| 罗山县| 宜兰县| 聊城市| 宜都市| 祁阳县|