A. 如何分析解決android ANR
AndroidANR是程序無法響應的問題,可以由以下方式解決:將一些消耗時間的代碼放到Handler類裡面去執行,相當於另外開一個線程,不會阻塞主線程,從而避免引發ANR的問題,如下代碼:privateHandlerhandler=newHandler();//新建一個handler類privateRunnablemyRunnable=newRunnable(){//新建一個Runnable來開設一個線程publicvoidrun(){if(run){handler.postDelayed(this,1000);count++;}tvCounter.setText("Count:"+count);//裡面來執行一些控制項的更新}};應用程序應該避免在BroadcastReceiver里做耗時的操作或計算。但不再是在子線程里做這些任務(因為BroadcastReceiver的生命周期短),替代的是,如果響應Intent廣播需要執行一個耗時的動作的話,應用程序應該啟動一個Service。
B. 如何分析解決Android ANR
ANR定義:在Android上,如果你的應用程序有一段時間響應不夠靈敏,系統會向用戶顯示一個對話框,這個對話框稱作應用程序無響應(ANR:Application Not Responding)對話框。用戶可以選擇「等待」而讓程序繼續運行,也可以選擇「強制關閉」。所以一個流暢的合理的應用程序中不能出現anr,而讓用戶每次都要處理這個對話框。因此,在程序里對響應性能的設計很重要,這樣系統不會顯示ANR給用戶。
C. 如何分析解決Android ANR
Android ANR是程序無法響應的問題,可以由以下方式解決:
將一些消耗時間的代碼放到Handler類裡面去執行,相當於另外開一個線程,不會阻塞主線程,從而避免引發ANR的問題,如下代碼:
private Handler handler = new Handler(); //新建一個handler類
private Runnable myRunnable= new Runnable() { //新建一個Runnable來開設一個線程
public void run() {
if (run) {
handler.postDelayed(this, 1000);
count++;
}
tvCounter.setText("Count: " + count); //裡面來執行一些控制項的更新
}
};
應用程序應該避免在BroadcastReceiver里做耗時的操作或計算。但不再是在子線程里做這些任務(因為 BroadcastReceiver的生命周期短),替代的是,如果響應Intent廣播需要執行一個耗時的動作的話,應用程序應該啟動一個 Service。
D. 如何分析解決Android ANR
android代碼完全沒有錯誤,但是有時候會發出「應用程序×××無法響應」的異常,這讓很多做android開發的人員很是郁悶,所以我這里就專門來解析一下,以及談談它的解決方案。 android 應用程序運行起來都有一個UI主線程,如果你把一個耗時的操作放在主線程里,而用戶在5秒內沒做任何輸入(觸摸屏幕或按鈕),則這時候android系統就會自動彈出「應用程序×××無法響應」的異常,而且這時候還存在一個問題,程序阻塞在那裡,用戶界面就無法及時更新,界面卡在那裡,造成假死機的狀態;還有就是廣播接收器的生命周期只有10s,如果耗時操作超過了這個值,也會彈出這個異常窗口,但對於Android平台來說UI控制項都沒有設計成為線程安全類型,所以需要引入一些同步的機制來使其刷新,這點Google在設計Android時倒是參考了下Win32的消息處理機制。 1. 對於線程中的刷新一個View為基類的界面,可以使用postInvalidate()方法在線程中來處理,其中還提供了一些重寫方法比如postInvalidate(int left,int top,int right,int bottom) 來刷新一個矩形區域,以及延時執行,比如postInvalidateDelayed(long delayMilliseconds)或postInvalidateDelayed(long delayMilliseconds,int left,int top,int right,int bottom) 方法,其中第一個參數為毫秒,如下: 2. 當然推薦的方法是通過一個Handler來處理這些,可以在一個線程的run方法中調用handler對象的 postMessage或sendMessage方法來實現,Android程序內部維護著一個消息隊列,會輪訓處理這些,如果你是Win32程序員可以很好理解這些消息處理,不過相對於Android來說沒有提供 PreTranslateMessage這些干涉內部的方法。 3. Looper又是什麼呢? ,其實Android中每一個Thread都跟著一個Looper,Looper可以幫助Thread維護一個消息隊列,昨天的問題 Can't create handler inside thread 錯誤 一文中提到這一概念,但是Looper和Handler沒有什麼關系,我們從開源的代碼可以看到Android還提供了一個Thread繼承類HanderThread可以幫助我們處理,在HandlerThread對象中可以通過getLooper方法獲取一個Looper對象控制句柄,我們可以將其這個Looper對象映射到一個Handler中去來實現一個線程同步機制,Looper對象的執行需要初始化Looper.prepare方法就是昨天我們看到的問題,同時推出時還要釋放資源,使用Looper.release方法。 4.Message 在Android是什麼呢? 對於Android中Handler可以傳遞一些內容,通過Bundle對象可以封裝String、Integer以及Blob二進制對象,我們通過在線程中使用Handler對象的 sendEmptyMessage或sendMessage方法來傳遞一個Bundle對象到Handler處理器。對於Handler類提供了重寫方法handleMessage(Message msg) 來判斷,通過msg.what來區分每條信息。將Bundle解包來實現Handler類更新UI線程中的內容實現控制項的刷新操作。相關的Handler對象有關消息發送sendXXXX相關方法如下,同時還有postXXXX相關方法,這些和Win32中的道理基本一致,一個為發送後直接返回,一個為處理後才返回 : 5. java.util.concurrent對象分析,對於過去從事Java開發的程序員不會對Concurrent對象感到陌生吧,他是JDK 1.5以後新增的重要特性作為掌上設備,我們不提倡使用該類,考慮到Android為我們已經設計好的Task機制,我們這里Android開發網對其不做過多的贅述,相關原因參考下面的介紹: 6. 在Android中還提供了一種有別於線程的處理方式,就是Task以及AsyncTask,從開源代碼中可以看到是針對Concurrent的封裝,開發人員可以方便的處理這些非同步任務,具體的Android123在以前的文章中有詳細解釋,可以使用站內搜索來了解更多。 解決辦法,就是把這個耗時操作放在一個服務組件去執行,並創建一個新的子線程,而不是放在UI線程里,android的new Thread/new Runnalbe好像在這里無效,而是要新建一個線程,並放在Handler里進行處理,以進行耗時操作的同時,不停的去循環監聽UI線程,以及時響應用戶的操作,以免造成假死機的狀態。具體實現代碼如下: //服務啟動 public int onStartCommand(Intent intent, int flags, int startId) { //先在主線程里新建(實例化)一個HandlerThread 對象 HandlerThread handlerThread = new HandlerThread("handler_thread"); //在使用HandlerThread的getLooper()方法之前,必須先調用該類的start(); handlerThread.start(); //利用HandlerThread .getLooper實例化一個handler對象,該HandlerThread 與該messageQueue關聯 MyHandler myHandler = new MyHandler(handlerThread.getLooper()); //獲得該handler里的消息 Message msg = myHandler.obtainMessage(); //將msg發送到目標對象,所謂的目標對象,就是生成該msg對象的handler對象 msg.sendToTarget(); stopSelf(); return super.onStartCommand(intent, flags, startId); } //Handler類 class MyHandler extends Handler{ public MyHandler(){ } public MyHandler(Looper looper){ super(looper); } @Override public void handleMessage(Message msg) {//接收message發過來的消息 //耗時的操作 } }
E. android anr怎麼解決
ANR (Application Not
Responding)
ANR定義:在Android上,如果你的應用程序有一段時間響應不夠靈敏,系統會向用戶顯示一個對話框,這個對話框稱作應用程序無響應(ANR:Application
Not
Responding)對話框。用戶可以選擇「等待」而讓程序繼續運行,也可以選擇「強制關閉」。所以一個流暢的合理的應用程序中不能出現anr,而讓用戶每次都要處理這個對話框。因此,在程序里對響應性能的設計很重要,這樣系統不會顯示ANR給用戶。
默認情況下,在android中Activity的最長執行時間是5秒,BroadcastReceiver的最長執行時間則是10秒。
第一:什麼會引發ANR?
在Android里,應用程序的響應性是由Activity
Manager和WindowManager系統服務監視的
。當它監測到以下情況中的一個時,Android就會針對特定的應用程序顯示ANR:
在5秒內沒有響應輸入的事件(例如,按鍵按下,屏幕觸摸)
2.BroadcastReceiver在10秒內沒有執行完畢
造成以上兩點的原因有很多,比如在主線程中做了非常耗時的操作,比如說是下載,io異常等。
潛在的耗時操作,例如網路或資料庫操作,或者高耗時的計算如改變點陣圖尺寸,應該在子線程里
(或者以資料庫操作為例,通過非同步請求的方式)來完成。然而,不是說你的主線程阻塞在那裡等待子線程的完成——也不是調用
Thread.wait()或是Thread.sleep()。替代的方法是,主線程應該為子線程提供一個Handler,以便完成時能夠提交給主線程。
以這種方式設計你的應用程序,將能保證你的主線程保持對輸入的響應性並能避免由於5秒輸入事件的超時引發的ANR對話框。
第二:如何避免ANR?
1、運行在主線程里的任何方法都盡可能少做事情。特別是,Activity應該在它的關鍵生命周期方
法(如onCreate()和onResume())里盡可能少的去做創建操作。(可以採用重新開啟子線程的方式,然後使用
Handler+Message的方式做一些操作,比如更新主線程中的ui等)
2、應用程序應該避免在BroadcastReceiver里做耗時的操作或計算。但不再是在子線程里做這些任務(因為
BroadcastReceiver的生命周期短),替代的是,如果響應Intent廣播需要執行一個耗時的動作的話,應用程序應該啟動一個
Service。(此處需要注意的是可以在廣播接受者中啟動Service,但是卻不可以在Service中啟動broadcasereciver,關於原因後續會有介紹,此處不是本文重點)
3、避免在Intent
Receiver里啟動一個Activity,因為它會創建一個新的畫面,並從當前用戶正在運行的程序上搶奪焦點。如果你的應用程序在響應Intent廣
播時需要向用戶展示什麼,你應該使用Notification Manager來實現。
總結:anr異常也是在程序中自己經常遇到的問題,主要的解決辦法自己最常用的就是不要在主線程中做
耗時的操作,而應放在子線程中來實現,比如採用Handler+mesage的方式,或者是有時候需要做一些和網路相互交互的耗時操作就採用
asyntask非同步任務的方式(它的底層其實Handler+mesage有所區別的是它是線程池)等,在主線程中更新UI。
F. android開發過程中遇到 ANR問題怎麼解決
ANR: 很多初入Android開發的網友可能發現ANR的字樣,到底Android ANR是什麼呢? 其實ANR就是Application Not Responding的全稱,當某個應用處於長期假死狀態時Android系統會彈出一個窗口上面寫道,XXX is not responding給出兩個按鈕一個為force close一個為wait。 可能觸發ANR的情況 1. 長時間的I/O處理,比如讀寫大文件,網路訪問時造成的阻塞。 2. 執行耗時的運算,Android默認為超過5000ms即5秒開始彈出ANR窗口,某些應用可能首次執行時沒有緩存十分耗時,可以通過Splash播放閃屏Logo等方式來延緩載入 3. Service和appWidget中也要注意多線程的使用,除非它和Activity工作在不同的進程。 避免ANR的方法 1. 單獨開工作者線程,通過獨立的Thread或使用類似AsyncTask的方式來處理耗時的內容。 2. 耗時的操作盡量分段處理,使用類似狀態機的方法,類似Symbian的活動對象將一個復雜的事情,分段執行。 3. UI線程中不要處理過多的內容,比如將一個5MB的文本,讓TextView去setText,要知道這種UI操作,沒有什麼好方法去解決的,所以Android123提示,遇到UI中需要執行復雜的操作,可以參考上面2提到的分段處理方式。
G. 如何分析解決Android ANR
ANR:Application Not Responding(應用程序無響應).當出現下列情況時,Android就會顯示ANR對話框了: 對輸入事件(如按鍵、觸摸屏事件)的響應超過5秒 意向接受器(intentReceiver)超過10秒鍾仍未執行完畢Android應用程序完全運行在一個獨立的線程中(例如main)。這就意味著,任何在主線程中運行的,需要消耗大量時間的操作都會引發ANR。
解決方案有兩種:
1)AsyncTask非同步任務中,doInBackground()和onPostExecute(Result)兩個方法非常重要
doInBackground()這個方法運行在後台線程中,主要負責執行那些很耗時的操作,如移動護理系統中的網路連接、解析XML等操作。該方法必須重載。
onPostExecute(Result)這個方法也運行於UI線程,在doInBackground(Params…)方法執行後調用,該方法用於處理後台任務執行後返回的結果。
2) 子thread + handler
總之盡量避免在activity主線程當做一些耗時的操作
H. 如何分析解決Android ANR
引發ANR的原因:
在Android里,應用程序的響應性是由Activity Manager和WindowManager系統服務監視的 。當它監測到以下情況中的一個時,Android就會針對特定的應用程序顯示ANR:
1.在5秒內沒有響應輸入的事件(例如,按鍵按下,屏幕觸摸)
2.BroadcastReceiver在10秒內沒有執行完畢
造成以上兩點的原因有很多,比如在主線程中做了非常耗時的操作,比如說是下載,io異常等。
潛在的耗時操作,例如網路或資料庫操作,或者高耗時的計算如改變點陣圖尺寸,應該在子線程里(或者以資料庫操作為例,通過非同步請求的方式)來完成。然而,不是說你的主線程阻塞在那裡等待子線程的完成——也不是調用 Thread.wait()或是Thread.sleep()。替代的方法是,主線程應該為子線程提供一個Handler,以便完成時能夠提交給主線程。以這種方式設計你的應用程序,將能保證你的主線程保持對輸入的響應性並能避免由於5秒輸入事件的超時引發的ANR對話框。