關於Android Force Close 出現的原因 以及解決方法。
1,forceclose出現原因
forceclose,意為強行關閉,當前應用程序發生瞭沖突
NullPointExection(空指針),IndexOutOfBoundsException(角標越界)等等一系列未捕獲異常
2,避免forceclose方案
首先是盡可能的保證程序不出這些異常,如果有些異常實在不可避免而又不想讓程序彈出forceclose彈窗,可以使用UncaughtExceptionHandler。。當程序出現未捕獲異常時會去調用UncaughtExctionHandler中的uncaughtException方法,我們要做的就是實現UncaughtExceptionHandler類,自行處理未捕獲異常,代碼如下:
importjava.lang.Thread.UncaughtExceptionHandler;
importjava.util.ArrayList;
importjava.util.List;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.os.Process;
importandroid.util.Log;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.TextView;
publicclassMainActivityextendsActivityimplementsUncaughtExceptionHandler,
OnClickListener{
privateListmList=newArrayList();
privateTextViewmTv;
privateintpid;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
//TODOAuto-generatedmethodstub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("tag","—>>onCreate");
initView();
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
protectedvoidonStart(){
//TODOAuto-generatedmethodstub
super.onStart();
Log.i("tag","—>>onstart");
}
@Override
protectedvoidonRestart(){
//TODOAuto-generatedmethodstub
super.onRestart();
Log.i("tag","—>>onRestart");
}
@Override
protectedvoidonResume(){
//TODOAuto-generatedmethodstub
super.onResume();
Log.i("tag","—>>onresume");
}
/**
*初始化控件
*/
privatevoidinitView(){
mTv=(TextView)findViewById(R.id.tv);
mTv.setOnClickListener(this);
}
@Override
publicvoiduncaughtException(Threadarg0,Throwablearg1){
//TODOAuto-generatedmethodstub
Log.i("tag","截獲到forceclose,異常原因為:"+"\n"+
arg1.toString());
finish();//結束當前activity
}
@Override
publicvoidonClick(Viewarg0){
//TODOAuto-generatedmethodstub
switch(arg0.getId()){
caseR.id.tv:
mList.get(1);//產生異常
break;
default:
break;
}
}
@Override
protectedvoidonPause(){
super.onPause();
Log.i("tag","–》onpause");
}
@Override
protectedvoidonStop(){
//TODOAuto-generatedmethodstub
super.onStop();
Log.i("tag","—>onstop");
}
@Override
protectedvoidonDestroy(){
//TODOAuto-generatedmethodstub
super.onDestroy();
Log.i("tag","–>ondestroy");
}
}
接下來,看log日志的結果:
成功捕獲到瞭異常,而且activity也退出瞭,可是並不是安全退出,因為當你再次點擊打開apk時,發現程序無響應,出現的錯誤log如下:
程序加載activity超時,這涉及到activity的啟動過程,大傢可以參考老羅的博客,裡邊兒介紹的很詳細
為瞭解決上述問題,我在uncaughtException方法裡將進程殺死,殺死進程有好多中方法,在此列舉一個自殺式方法
修改如下:
@Override
protectedvoidonStart(){
//TODOAuto-generatedmethodstub
super.onStart();
pid=android.os.Process.myPid();//獲取到本應用程序的pid
Log.i("tag","—>>onstart");
}
@Override
publicvoiduncaughtException(Threadarg0,Throwablearg1){
//TODOAuto-generatedmethodstub
Log.i("tag","截獲到forceclose,異常原因為:"+"\n"+
arg1.toString());
Process.killProcess(pid);//殺死進程
}
其他程序未變。。
privateclassChildThreadimplementsRunnable,UncaughtExceptionHandler{
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
publicvoiduncaughtException(Threadarg0,Throwablearg1){
//TODOAuto-generatedmethodstub
Log.i("tag","childThread");
}
} 然後在activity的生命周期中開啟子線程,監聽未捕獲異常的發生