Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> 詳解android開發中常遇見的ANR異常

詳解android開發中常遇見的ANR異常

編輯:Android開發實例

 1、什麼是ANR異常?

application not response 應用程序無響應。在用戶進行一個操作,如果用戶在6秒內沒有操作的話,就會出現異常

代碼示例:

 

  1. import android.app.Activity; 
  2. import android.os.Bundle; 
  3. import android.view.View; 
  4. import android.widget.Toast; 
  5.  
  6. public class MainActivity extends Activity { 
  7.     public void onCreate(Bundle savedInstanceState) { 
  8.         super.onCreate(savedInstanceState); 
  9.         setContentView(R.layout.main); 
  10.     } 
  11.      
  12.     public void doSomething(View view) throws Exception { 
  13.         try { 
  14.             Thread.sleep(10000);//讓主線程睡眠 
  15.         } catch (InterruptedException e) { 
  16.             e.printStackTrace(); 
  17.         } 
  18.         System.out.println("從網絡獲取數據成功!"); 
  19.     } 
  20.      
  21.     public void toast(View view) { 
  22.         Toast.makeText(this, "十八大開幕了!", 0).show(); 
  23.     } 

2、為什麼會出現ANR異常?

android系統中處理用戶操作的工作時在主線程中執行的,如果我們的程序在主線程中進行一些耗時的操作,導致用戶的操作6秒不能夠處理,就會出現異常。

主線程休眠,那麼再點擊程序,必須等主線程睡醒後才會反應。

所以在主線程中不要做太耗時的工作,因為主界面會阻塞。

 

3、解決辦法:讓這些耗時的操作放在新線程裡面操作。

注意:如果新線程裡面做的事情要更新界面的話,就要使用handler來操作。

連接網絡的事都要放在新線程裡面的。

解決代碼(包括更新界面的操作,使用的是handler):

 

  1. import android.app.Activity; 
  2. import android.os.Bundle; 
  3. import android.os.Handler; 
  4. import android.view.View; 
  5. import android.widget.TextView; 
  6. import android.widget.Toast; 
  7.  
  8. public class MainActivity extends Activity { 
  9.     private TextView numTV; 
  10.     private Handler handler = new Handler(); 
  11.     private int i; 
  12.  
  13.     public void onCreate(Bundle savedInstanceState) { 
  14.         super.onCreate(savedInstanceState); 
  15.         setContentView(R.layout.main); 
  16.  
  17.         numTV = (TextView) findViewById(R.id.numTV); 
  18.     } 
  19.  
  20.     public void doSomething(View view) throws Exception { 
  21.         new Thread() { 
  22.             public void run() { 
  23.                 for (i = 1; i < 20; i++) { 
  24.                     handler.post(new Runnable() { 
  25.                         public void run() { 
  26.                             numTV.setText(i + ""); 
  27.                         } 
  28.                     }); 
  29.                     System.out.println(i); 
  30.                     try { 
  31.                         Thread.sleep(1000); 
  32.                     } catch (InterruptedException e) { 
  33.                         e.printStackTrace(); 
  34.                     } 
  35.                 } 
  36.             }; 
  37.         }.start(); 
  38.     } 
  39.  
  40.     public void toast(View view) { 
  41.         Toast.makeText(this, "十八大開幕了!", 0).show(); 
  42.     } 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved