1. 程式人生 > >Android-ANR異常

Android-ANR異常

A N R :

Application Not Responding : 應用沒有響應異常

 

引發ANR的原因是,元件的主執行緒去執行了耗時操作多少秒,就會引發ARN異常;

 

引發ANR異常的案例:

package com.example.administrator.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends
AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); for (int i = 0; i < 10; i++) { try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } } Toast.makeText(
this, "onCreate執行完畢.....", Toast.LENGTH_SHORT).show(); } }

 執行結果:此ANR異常時Android作業系統報出的,作業系統檢測到元件被阻塞,認為此應用,需要結束掉了 

 

執行緒執行圖:

 

 


 

 

 

解決方案:

在元件的主執行緒加入子執行緒,保證不影響主執行緒,保證不阻塞主執行緒,只要保證元件的主執行緒正常執行就不會引發ANR異常

package com.example.administrator.myapplication;

import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /** * 增加子執行緒執行耗時操作,保證主執行緒正常執行 */ new Thread(){ @Override public void run() { super.run(); for (int i = 0; i < 10; i++) { try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); /** * 增加了子執行緒 後 不影響元件的主執行緒執行 */ // 提示 Toast.makeText(this, "onCreate執行完畢.....", Toast.LENGTH_SHORT).show(); } }

 

 執行結果,增加了子執行緒就不影響主執行緒運行了,從而就不會引發ANR異常:

 

 執行緒執行圖: