Android-ANR異常
阿新 • • 發佈:2019-01-12
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 extendsAppCompatActivity { @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異常:
執行緒執行圖: