關於Android Force Close 出現的原因 以及解決方法

關於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的生命周期中開啟子線程,監聽未捕獲異常的發生

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *