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

Android ANR

移動開發(fā) Android
到底Android ANR是什么呢? 其實ANR就是Application Not Responding的全稱,當某個應用處于長期假死狀態(tài)時Android系統(tǒng)會彈出一個窗口上面寫道,XXX is not responding給出兩個按鈕一個為force close一個為wait。

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

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

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

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

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

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

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

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

2 如何避免ANR?

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

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

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

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

3)增強響應靈敏性

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

如果你的應用程序為響應用戶輸入正在后臺工作的話,可以顯示工作的進度(ProgressBar和ProgressDialog對這種情況來說很有用)。
特別是游戲,在子線程里做移動的計算。

如果你的應用程序有一個耗時的初始化過程的話,考慮可以顯示一個Splash Screen或者快速顯示主畫面并異步來填充這些信息。在這兩種情況下,你都應該顯示正在進行的進度,以免用戶認為應用程序被凍結(jié)了。

【編輯推薦】

 Android布局屬性詳解

Android開發(fā)之旅:Android架構(gòu)

Android Activity和Intent機制學習筆記

 Android核心分析之一->分析方法論探討之設(shè)計意圖

責任編輯:zhaolei 來源: 網(wǎng)絡(luò)轉(zhuǎn)載
相關(guān)推薦

2025-04-29 08:21:30

ANRAndroidUI

2021-08-10 15:23:08

鴻蒙HarmonyOS應用

2024-03-12 17:13:51

2021-08-03 16:35:04

AndroidANR內(nèi)存

2024-05-21 08:22:10

線程主線程程序

2022-02-17 19:47:03

安卓ANR故障

2012-07-20 18:52:48

LTESingleSON華為

2024-12-10 08:41:12

語句if卡死

2011-05-31 08:54:37

Android開發(fā) 架構(gòu)

2013-05-03 15:17:59

Android開發(fā)Android SDK

2012-04-25 22:52:40

2013-12-25 09:34:26

Android SDKAndroid組件

2013-01-16 14:41:14

Android開發(fā)Android SDK

2011-06-14 15:49:45

Android視頻教程

2014-12-30 11:31:16

Android滑輪

2014-07-14 11:27:10

Android Wea

2015-08-17 11:39:28

AndroidM命名

2017-03-09 19:10:06

Android ThAndroid物聯(lián)網(wǎng)

2013-06-08 13:07:54

Android開發(fā)Android UILayout XML屬

2011-05-31 15:09:02

Android SDK 官方下載
點贊
收藏

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

主站蜘蛛池模板: 美女视频一区二区三区 | 久久99精品久久 | 久久国产精品视频 | 在线免费观看黄网 | 久久久成 | 一区亚洲 | 视频三区| 国产精品久久一区二区三区 | 日本精品一区二区三区四区 | 国产极品粉嫩美女呻吟在线看人 | 午夜在线小视频 | 狼色网| 高清免费在线 | 国产精品不卡一区二区三区 | 亚洲五码久久 | 亚洲天堂中文字幕 | 91国产精品在线 | 欧美jizzhd精品欧美巨大免费 | 久久草视频 | 国产精品一区一区 | 亚洲一区中文字幕 | 99热精品久久 | 精品国产乱码久久久久久图片 | 毛片av免费在线观看 | 自拍偷拍亚洲一区 | 99re在线 | 性高湖久久久久久久久3小时 | 精品亚洲一区二区 | 国产一区二区三区在线视频 | 日韩二区 | 精品国产91 | 久久精品女人天堂av | 欧美精产国品一二三区 | 99精品视频一区二区三区 | 精品国模一区二区三区欧美 | 亚洲伊人精品酒店 | 精品久久ai电影 | 国产一区二区日韩 | 日韩一级电影免费观看 | 欧美日韩最新 | 精品一区国产 |