国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
【轉(zhuǎn)】提高Android應(yīng)用響應(yīng)靈敏性

提高Android應(yīng)用響應(yīng)靈敏性

默認(rèn)分類2010-11-17 09:59:51閱讀6評論0  字號: 訂閱

可能會存在這樣的情況,你寫的代碼通過了世界上所有的性能測試,但當(dāng)用戶嘗試使用你的應(yīng)用程序時,仍然讓用戶感到不爽。應(yīng)用程序響應(yīng)不夠靈敏的地方包括——反映遲鈍,掛起或凍結(jié)很長時間,或者需要花費很長的時間來處理輸入。

 

在Android上,如果你的應(yīng)用程序有一段時間響應(yīng)不夠靈敏,系統(tǒng)會向用戶顯示一個對話框,這個對話框稱作應(yīng)用程序無響應(yīng)(ANR:Application NotResponding)對話框。用戶可以選擇讓程序繼續(xù)運(yùn)行,但是,他們在使用你的應(yīng)用程序時,并不希望每次都要處理這個對話框。因此,在程序里對響應(yīng)性能的設(shè)計很重要,這樣,系統(tǒng)不會顯示ANR給用戶。

 

一般說來,如果應(yīng)用程序不能響應(yīng)用戶輸入的話,系統(tǒng)會顯示一個ANR。例如,一個應(yīng)用程序阻塞在一些I/O操作上(通常是網(wǎng)絡(luò)訪問),這時,應(yīng)用程序的主線程就不能再處理用戶的輸入事件。經(jīng)過一定的時間后,系統(tǒng)認(rèn)為應(yīng)用程序已經(jīng)掛起,并顯示ANR來讓用戶選擇殺死應(yīng)用程序。

 

相似地,如果你的應(yīng)用程序花費太多的時間來構(gòu)建詳細(xì)的內(nèi)存結(jié)構(gòu),或者也許是在游戲里花費太多時間來計算下一步移動,這時,系統(tǒng)會認(rèn)為你的應(yīng)用程序已經(jīng)掛起。因此,確保這些計算是高效的往往很重要,但即使是最高效的代碼仍然需要花費時間來運(yùn)行。

 

在這兩種情況下,解決的方法通常是創(chuàng)建一個子線程,然后在線程里做你的大部分工作。這能讓主線程(驅(qū)動UI事件循環(huán))保持運(yùn)行,并阻止系統(tǒng)認(rèn)為你的代碼已經(jīng)凍結(jié)。因為這些線程通常是在類級別上完成的,因此,你可以認(rèn)為響應(yīng)性能問題是一個類的問題。(與基本性能相比而言,基本性能問題認(rèn)為是方法級別的問題)

 

這篇文章將討論Android系統(tǒng)如何判斷一個應(yīng)用程序處于無響應(yīng)狀態(tài),并為保證應(yīng)用程序的響應(yīng)性提供向?qū)А?

 

這篇文章囊括這些主題:

  • 什么引發(fā)了ANR?
  • 如何避免ANR?
  • 增強(qiáng)響應(yīng)靈敏性

 

1)什么引發(fā)了ANR

在Android里,應(yīng)用程序的響應(yīng)性是由Activity Manager和WindowManager系統(tǒng)服務(wù)監(jiān)視的。當(dāng)它監(jiān)測到以下情況中的一個時,Android就會針對特定的應(yīng)用程序顯示ANR:

  • 在5秒內(nèi)沒有響應(yīng)輸入的事件(例如,按鍵按下,屏幕觸摸)
  • BroadcastReceiver在10秒內(nèi)沒有執(zhí)行完畢

一個ANR對話框顯示給用戶

2)如何避免ANR

 

考慮上面的ANR定義,讓我們來研究一下為什么它會在Android應(yīng)用程序里發(fā)生和如何最佳構(gòu)建應(yīng)用程序來避免ANR。

 

Android應(yīng)用程序通常是運(yùn)行在一個單獨的線程(例如,main)里。這意味著你的應(yīng)用程序所做的事情如果在主線程里占用了太長的時間的話,就會引發(fā)ANR對話框,因為你的應(yīng)用程序并沒有給自己機(jī)會來處理輸入事件或者Intent廣播。

 

因此,運(yùn)行在主線程里的任何方法都盡可能少做事情。特別是,Activity應(yīng)該在它的關(guān)鍵生命周期方法(如onCreate()和onResume())里盡可能少的去做創(chuàng)建操作。潛在的耗時操作,例如網(wǎng)絡(luò)或數(shù)據(jù)庫操作,或者高耗時的計算如改變位圖尺寸,應(yīng)該在子線程里(或者以數(shù)據(jù)庫操作為例,通過異步請求的方式)來完成。然而,不是說你的主線程阻塞在那里等待子線程的完成——也不是調(diào)用Thread.wait()或是Thread.sleep()。替代的方法是,主線程應(yīng)該為子線程提供一個Handler,以便完成時能夠提交給主線程。以這種方式設(shè)計你的應(yīng)用程序,將能保證你的主線程保持對輸入的響應(yīng)性并能避免由于5秒輸入事件的超時引發(fā)的ANR對話框。這種做法應(yīng)該在其它顯示UI的線程里效仿,因為它們都受相同的超時影響。

 

IntentReceiver執(zhí)行時間的特殊限制意味著它應(yīng)該做:在后臺里做小的、瑣碎的工作如保存設(shè)定或者注冊一個Notification。和在主線程里調(diào)用的其它方法一樣,應(yīng)用程序應(yīng)該避免在BroadcastReceiver里做耗時的操作或計算。但不再是在子線程里做這些任務(wù)(因為BroadcastReceiver的生命周期短),替代的是,如果響應(yīng)Intent廣播需要執(zhí)行一個耗時的動作的話,應(yīng)用程序應(yīng)該啟動一個Service。順便提及一句,你也應(yīng)該避免在IntentReceiver里啟動一個Activity,因為它會創(chuàng)建一個新的畫面,并從當(dāng)前用戶正在運(yùn)行的程序上搶奪焦點。如果你的應(yīng)用程序在響應(yīng)Intent廣播時需要向用戶展示什么,你應(yīng)該使用Notification Manager來實現(xiàn)。

 

3)增強(qiáng)響應(yīng)靈敏性

 

一般來說,在應(yīng)用程序里,100到200ms是用戶能感知阻滯的時間閾值。因此,這里有一些額外的技巧來避免ANR,并有助于讓你的應(yīng)用程序看起來有響應(yīng)性。

 

  • 如果你的應(yīng)用程序為響應(yīng)用戶輸入正在后臺工作的話,可以顯示工作的進(jìn)度(ProgressBar和ProgressDialog對這種情況來說很 有用)。
  • 特別是游戲,在子線程里做移動的計算。
  • 如果你的應(yīng)用程序有一個耗時的初始化過程的話,考慮可以顯示一個Splash Screen或者快速顯示主畫面并異步來填充這些信息。在這兩種情況下,你都應(yīng)該顯示正在進(jìn)行的進(jìn)度,以免用戶認(rèn)為應(yīng)用程序被凍結(jié)了
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
【原創(chuàng)】Android 系統(tǒng)穩(wěn)定性
Android vitals 幫您解決應(yīng)用質(zhì)量問題
【Android】ANR和FC
android面試題 集合了很多Android面試題目值得收藏
Android開發(fā)中避免應(yīng)用無響應(yīng)的方法(Application Not Responding、ANR)
Android中的多線程編程詳解
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服