成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

切記!不要在UI主線程中進行耗時的操作

移動開發 Android
這是一個很棒的問題,畢竟開發者總是希望基于舊版本系統開發的應用在新版本的Android系統仍能兼容。在我看來,問題的原因可能多種多樣。 但大多數時候,原因非常簡單:你把一個可能非常耗時的操作放進了UI線程。

問題

自Android Ice Cream Sandwich發布后, 這個問題就開始在StackOverflow彌散開來:

我的應用在Android2.x上運行良好,但是在3.x 和4.x系統上總是強退,是什么導致的?

這是一個很棒的問題,畢竟開發者總是希望基于舊版本系統開發的應用在新版本的Android系統仍能兼容。在我看來,問題的原因可能多種多樣。 但大多數時候,原因非常簡單:你把一個可能非常耗時的操作放進了UI線程。

 

什么是UI線程?

 

應用的主UI線程的概念及其重要性是每個Android開發者都應理解。當一個應用啟動,系統會為應用創建一個名為“main”的主線程。這個主線程(也就是UI主線程)主要負責把事件分發給合適的view或者widget, 因此它非常重要。它也是你的應用和應用的UI交互的線程。例如,如果你點擊了屏幕上的一個按鈕,UI線程會把點擊時間交給view處理,view接到事件后會設置它的pressed狀態,然后向事件隊列中發送一個invalidate請求。 UI線程會依次讀取隊列并且告訴view去重繪自己。

除非你的Android應用實現的非常合理,否則這個單線程模型會使性能變得極低。在極端情況下,如果UI線程負責整個應用中的所有操作,進行耗時的操作比如發送網絡請求,或者數據庫查詢等都會導致用戶界面的阻塞。這些操作在未完成之前,所有的時間包括繪制和觸屏事件都不會被派發。從用戶的角度來看,程序似乎是卡死了。

在這些情況下,即時的反饋相當重要。研究表明0.1s是用戶感覺系統是否流暢的臨界值。任何比臨界值更慢的都被認為延遲(Miller 1968; Card et al. 1991)。雖然1秒看起來沒什么影響,但在GooglePlay中,即便是十分之一秒也可能是好評和差評的區別。更糟糕的是,如果UI線程被阻塞5秒以上,用戶會收到“程序未響應”(ANR)的提示對話框,并且會強制退出。

 

為什么Android會使應用崩潰

 

應用在2.x系統運行良好,在3.0及以上平臺上崩潰的主要原因在于,3.0以上平臺在處理UI線程資源濫用上更加嚴格。比如說,3.0平臺檢測到UI線程中有網絡請求時,會拋出NetworkOnMainThreadExceptionwill的異常:

E/AndroidRuntime(673): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.ExampleActivity}: android.os.NetworkOnMainThreadException

Android developer網站文檔中也對此進行了很好的解釋:

當應用試圖在主線程中進行網絡操作,NetworkOnMainThreadException會被拋出。只有在運行Honeycomb SDK及更高的版本中會被拋出。更早版本的SDK允許在主事件循環線程中進行網絡操作,但是非常非常不鼓勵這么做。

列出一些ICS和Honeycomb不允許在UI線程中進行的操作:

打開套接字連接 (i.e. new Socket()).

 

HTTP 請求 (i.e. HTTPClient and HTTPUrlConnection).

 

試圖連接遠程的 MYSQL 數據庫.

 

下載文件 (i.e.Downloader.downloadFile()).

 

如果你要在UI線程中進行某些操作,一定要把它們打包到一個工作線程中。其中最簡單的方式是使用AsyncTask, 它允許你在你的用戶界面中進行一些異步的操作。AsyncTask會把阻塞操作放到工作線程中,并把結果返回到UI線程,而你不需要處理任何與線程相關的工作。

 

結論

 

我決定寫這篇主題的念頭來源于我在StackOerflow和其它論壇上無數次看到了這個問題。問題的主要來源是在UI線程進行了耗時的操作。為了確保用戶界面保持流暢,有必要把執行套接字連接、HTTP請求、文件下載和其他的耗時操作放到一個單獨的線程中。最簡單的方法就是把操作打包到AsyncTask中,它會幫助你啟動新的線程并讓他們與你的用戶界面異步交互。

 

有幫助的鏈接

 

這些資料可能會幫助你熟悉AsyncTask

AsyncTask documentation

 

Multithreading For Performance

 

責任編輯:chenqingxiang
相關推薦

2023-03-17 16:42:45

應用開發Ability

2017-03-13 10:41:33

iOSUI操作主線程

2012-03-28 22:06:15

Android

2017-01-03 17:57:46

Android異步精髓Handler

2010-02-01 17:33:24

Python主線程

2010-02-02 16:47:12

Python主線程

2024-04-15 12:27:00

await面試接口

2025-04-11 11:55:49

2016-10-21 13:03:18

androidhandlerlooper

2023-01-17 17:45:28

UI界面多線程

2010-02-26 15:37:11

Python主線程

2010-03-10 19:34:45

Python主線程

2015-10-10 10:36:00

warning category

2021-10-20 14:53:31

Foreach強制阿里巴巴

2013-04-12 10:05:20

Android多線程后臺運行操作

2021-08-12 16:28:10

AndroidHandleLooper

2011-01-19 12:52:49

WCF.NETC#

2023-09-27 10:19:37

類型video函數

2021-01-13 09:07:32

MySQLOrderLimit

2024-10-07 08:28:03

WPFUI應用程序
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久青青| 日韩高清国产一区在线 | 免费午夜电影 | 精品国产乱码久久久久久影片 | 九色国产 | 91精品国产综合久久久久久丝袜 | av网站在线看 | 国产在线a视频 | 日日噜噜噜夜夜爽爽狠狠视频, | 成人美女免费网站视频 | 国产高清在线观看 | av网址在线 | 久久精品欧美视频 | 亚洲综合一区二区三区 | 性一交一乱一透一a级 | 国产精品久久久久久久久久三级 | 亚洲精品一区久久久久久 | 亚洲国产精品久久久久秋霞不卡 | 精品视频一区二区 | 国产女人与拘做受视频 | 成人精品国产免费网站 | 精品伊人久久 | 欧美黄在线观看 | 亚洲高清中文字幕 | 中文天堂在线一区 | 黄色大片免费网站 | 国产电影一区二区三区爱妃记 | 日韩国产中文字幕 | 久久99精品久久久久久琪琪 | 成人在线观看免费视频 | 噜噜噜色网 | 精品在线一区二区 | 成人伊人网 | 尤物视频在线免费观看 | 成人一区二区电影 | 一区2区 | 国产精品中文字幕在线 | 日本精品久久久一区二区三区 | a成人| 国产99久久精品一区二区永久免费 | 91福利网|