android ANR異常及其解決方式

來源:互聯網
上載者:User

 

ANR定義

     在Android上,如果你的應用程式有一段時間響應不夠靈敏,系統會向使用者顯示一個對話方塊,這個對話方塊稱作應用程式無響應(ANR:Application Not Responding)對話方塊。使用者可以選擇讓程式繼續運行,但是,他們在使用你的應用程式時,並不希望每次都要處理這個對話方塊。因此,在程式裡對響應效能的設計很重要,這樣,系統不會顯示ANR給使用者。

 

 

解決ANR異常概述:   

 

考慮上面的ANR定義,讓我們來研究一下為什麼它會在Android應用程式裡發生和如何最佳構建應用程式來避免ANR。

 

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

 

因此,運行在主線程裡的任何方法都儘可能少做事情。特別是,Activity應該在它的關鍵生命週期方法(如onCreate()和onResume())裡儘可能少的去做建立操作。潛在的耗時操作,例如網路或資料庫操作,或者高耗時的計算如改變位元影像尺寸,應該在子線程裡(或者以資料庫操作為例,通過非同步請求的方式)來完成。然而,不是說你的主線程阻塞在那裡等待子線程的完成——也不是調用Thread.wait()或是Thread.sleep()。替代的方法是,主線程應該為子線程提供一個Handler,以便完成時能夠提交給主線程。以這種方式設計你的應用程式,將能保證你的主線程保持對輸入的響應性並能避免由於5秒輸入事件的逾時引發的ANR對話方塊。這種做法應該在其它顯示UI的線程裡效仿,因為它們都受相同的逾時影響。

 

 引起ANR異常的常見情況:

1、在主線程內進行網路操作,擷取伺服器上的資源

2、在主線程內進行一些緩慢的磁碟操作(

       應用應該在5秒或者10秒內響應

 

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

 

如果你的應用程式為響應使用者輸入正在後台工作的話,可以顯示工作的進度(ProgressBar和ProgressDialog對這種情況來說很有用)。


通過Handler解決ANR異常:

方式一:

1.開啟一個新的線程,進行資料請求,此線程內包含了比較耗時操作的代碼
2. 擷取資料後,調用handler.sendMessage方法
3. 在主線程中調用  handleMessgae(Message msg) 方法接收資料並更新UI

方式二:

 利用handler.post(new Runnable(){

              public void run(){

             -------------------- 耗時操作的代碼

           }}

        );

給建立handler對象的線程發送一個runnable,自動執行run方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.