android 线程太多,应用程序可能在其主线程上做了太多的工作。
任何開始開發android應用程序的人都會在logcat上看到這個消息。編舞(ABC):跳過xx幀!應用程序可能在其主線程上做了太多的工作?!澳敲?#xff0c;它到底意味著什么,你為什么要關心它,以及如何解決它。
這意味著您的代碼需要很長時間才能處理,而框架正因此而被跳過,這可能是因為您正在應用程序或DB訪問的核心做一些繁重的處理,或者其他導致線程停止一段時間的事情。下面是一個更詳細的解釋:Choreographer允許應用程序將自己連接到vsync,并對事情進行適當的時間安排以提高性能。
Android視圖動畫內部使用編舞器的目的是相同的:正確地計時動畫,并可能提高性能。
由于Choreographer被告知每個vsync事件,我可以判斷由Choreographer.post*API傳遞的Runnable是否沒有在一個幀的時間內完成,從而導致幀被跳過。
據我理解,編舞員只能檢測幀跳過。它無法解釋為什么會發生這種情況。
消息“應用程序可能在其主線程上做了太多的工作。”可能會誤導你。
你為什么要擔心
當這條消息彈出在Android仿真器上,并且跳過的幀數量相當少(<100)時,您可以安全地打賭仿真器是慢的-這種情況幾乎時有發生。但是,如果幀的數量跳過而且很大,并且按300+的順序排列,那么您的代碼可能會出現一些嚴重的問題。Android設備的硬件種類繁多,與iOS和Windows設備不同。RAM和CPU各不相同,如果您希望在所有設備上都有一個合理的性能和用戶體驗,那么您需要修復這個問題。當框架被跳過時,UI是緩慢和滯后的,這不是一種理想的用戶體驗。
如何修復
要解決這一問題,需要識別存在或可能發生長時間處理的節點。最好的方法是在一個與主UI線程分離的線程中完成所有的處理,不管這個線程有多小或多大。因此,無論是訪問SQLite數據庫中的數據,還是做一些硬核運算,還是簡單地對數組排序-在另一個線程中進行排序
現在這里有一個陷阱,您將為執行這些操作創建一個新線程,當您運行應用程序時,它會崩潰,說“只有創建視圖層次結構的原始線程才能觸摸其視圖”。您需要知道,Android中的UI只能由主線程或UI線程更改。任何其他試圖這樣做的線程都會失敗并與此錯誤崩潰。您需要做的是在runOnUiThread中創建一個新的Runnable,在這個Runnable中,您應該執行涉及UI的所有操作。找一個例子這里.
因此,我們有線程和可運行的處理數據的主線程,還有什么?Android中有AsyncTask,它允許在UI線程上執行長時間的進程。這是最有用的,當你的應用程序是數據驅動或WebAPI驅動或使用復雜的UI,如那些構建使用畫布。AsyncTask的功能是允許在后臺進行操作,一旦您完成了處理,您就可以簡單地在UI上執行所需的操作,而不會造成任何滯后效應。這是可能的,因為AsyncTask本身來自Activity的UI線程-您通過AsyncTask在UI上執行的所有操作都是一個與主UI線程不同的線程,不妨礙用戶交互。
因此,這是您需要知道的,以使順利的Android應用程序,據我所知,每個初學者從他的控制臺得到這條消息。
總結
以上是生活随笔為你收集整理的android 线程太多,应用程序可能在其主线程上做了太多的工作。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: latex数学符号加粗_LaTex数学公
- 下一篇: php-5.6.2-Win32-VC11