Android Force Close 에 나타 난 이상 원인 분석 및 해결 방법

6949 단어 androidforceclose
1.원인:
forceclose 는 강제 종료 라 는 뜻 으로 현재 프로그램 이 충돌 하고 있 습 니 다.
NullPointExection(빈 포인터),IndexOutOfBoundsException(아래 표 시 는 경 계 를 넘 었 습 니 다),Android API 가 사용 하 는 순서 오류 로 인해(예 를 들 어 setContentView()이전에 findViewById()작업 을 했 습 니 다)등 일련의 캡 처 되 지 않 은 이상 이 발생 할 수 있 습 니 다.
어떻게
Force Close 창 팝 업 을 피 하 는 방법 은 Thread.UncaughtExceptionHandler 인터페이스의 uncaughtException 방법 코드 는 다음 과 같 습 니 다.

public class MainActivity extends Activity implements Thread.UncaughtExceptionHandler,
View.OnClickListener {
private List<String> mList = new ArrayList<String>();
private Button btn;
private int pid;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("tag", "--->>onCreate");
initView();
//       handler
Thread.setDefaultUncaughtExceptionHandler(this);
}
/**
*      
*/
private void initView() {
btn = (Button) findViewById(R.id.main_btn);
btn.setOnClickListener(this);
}
@Override
public void uncaughtException(Thread arg0, Throwable arg1) {
// TODO Auto-generated method stub
Log.i("tag", "   forceclose,     :" + "
" + arg1.toString()+" Thread:"+arg0.getId()); // finish();// activity android.os.Process.killProcess(android.os.Process.myPid()); } @Override public void onClick(View arg0) { // TODO Auto-generated method stub switch (arg0.getId()) { case R.id.main_btn: mList.get(1) ;// break; default: break; } } @Override protected void onPause() { super.onPause(); Log.i("tag", "--》onpause"); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); Log.i("tag", "--->onstop"); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.i("tag", "-->ondestroy"); } }
캡 처 되 지 않 은 이상 을 처리 할 수 있 는 스 레 드 를 원 하 는 스 레 드.setDefault UncaughtExceptionHandler(this);이 코드 는 모두 그 라인 에서 한 번 실행 해 야 한다
uncaughtException 방법 에서 첫 번 째 매개 변 수 는 스 레 드 이 고 두 번 째 매개 변 수 는 이상 입 니 다.

public void uncaughtException(Thread arg0, Throwable arg1) {
// TODO Auto-generated method stub
Log.i("tag", "   forceclose,     :" + "
" + arg1.toString()+" Thread:"+arg0.getId()); // finish();// activity android.os.Process.killProcess(android.os.Process.myPid()); }
다음은 로그 로그 의 결 과 를 보십시오.
08-0918:50:27.87410739-10739/example.com.force_anrI/tag:--->>onCreate
08-0918:50:31.66410739-10739/example.com.force_anrI/tag:forceclose 를 캡 처 했 습 니 다.이상 원인 은:
java.lang.IndexOutOfBoundsException:Invalidindex1,sizeis0Thread:1
이상 을 성공 적 으로 포착 하 였 으 며,activity 도 종료 하 였 습 니 다.그러나 안전하게 종료 하 는 것 은 아 닙 니 다.다시 클릭 하여 apk 를 열 었 을 때 프로그램 이 응답 하지 않 는 것 을 발 견 했 기 때 문 입 니 다.
상술 한 문 제 를 해결 하기 위해 서,나 는 uncaughtException 방법 에서 프로 세 스 를 죽 이 고,프로 세 스 를 죽 이 는 데 여러 가지 방법 이 있 는데,여기 서 자살 식 방법 을 열거 합 니 다.
다음 과 같이 수정:

@Override 
public void uncaughtException(Thread arg0, Throwable arg1) { 
// TODO Auto-generated method stub 
Log.i("tag", "   forceclose,     :" + "
" + arg1.toString()); android.os.Process.killProcess(android.os.Process.myPid()); // }
다른 절 차 는 변 하지 않 았 다.
3.우 리 는 메 인 스 레 드 에서 이렇게 할 수 있 을 뿐만 아니 라 서브 스 레 드 에서 도 진행 할 수 있 습 니 다.
그리고 activity 의 수명 주기 에 하위 스 레 드 를 열 어 이상 이 발생 하지 않도록 감청 합 니 다.

class MyRunnable extends Thread implements Thread.UncaughtExceptionHandler {
@Override
public void run() {
// TODO Auto-generated method stub
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread arg0, Throwable arg1) {
// TODO Auto-generated method stub
Log.i("tag", "childThread:   forceclose,     :" + "
" + arg1.toString()+" Thread->"+arg0.getId()+" id->"+Thread.currentThread().getId()+" "+ Thread.currentThread().getName()); android.os.Process.killProcess(android.os.Process.myPid()); } }
여기 문제 가 있 습 니 다.우 리 는 분명히 하위 스 레 드 에서 이상 을 잡 았 습 니 다.그런데 어떻게 Thread 의 id->1 개의 스 레 드 id->1,왜 스 레 드 가 메 인 스 레 드 입 니까?아래 에서 이 문 제 를 토론 하 다.

08-09 19:02:47.734 14483-14483/example.com.force_anr I/tag: --->>onCreate
08-09 19:02:51.304 14483-14483/example.com.force_anr I/tag: childThread:   forceclose,     :
java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0 Thread->1    id->1 main 
4.세 번 째 문제 해결
우 리 는 하위 스 레 드 를 다시 씁 니 다:하위 스 레 드 에 이상 을 설정 하 는 동시에 activity 에서 이상 한 코드 를 캡 처 하고 이상 한 코드 를 삭제 하 는 것 을 잊 지 마 세 요.

class MyRunnable extends Thread implements Thread.UncaughtExceptionHandler {
int a[];
@Override
public void run() {
// TODO Auto-generated method stub
Thread.setDefaultUncaughtExceptionHandler(this);
int i = a[0];//  
}
@Override
public void uncaughtException(Thread arg0, Throwable arg1) {
// TODO Auto-generated method stub
Log.i("tag", "childThread:   forceclose,     :" + "
" + arg1.toString()+" Thread->"+arg0.getId()+" id->"+Thread.currentThread().getId()+" "+ Thread.currentThread().getName()); android.os.Process.killProcess(android.os.Process.myPid()); } }
시작 프로그램 에서 아래 로그 보기:

08-09 19:08:20.124 16308-16308/example.com.force_anr I/tag: --->>onCreate
08-09 19:08:20.124 16308-16341/example.com.force_anr I/tag: childThread:   forceclose,     :
java.lang.NullPointerException: Attempt to read from null array Thread->44829    id->44829 Thread-44829
08-09 19:08:20.254 16349-16349/example.com.force_anr I/tag: --->>onCreate
08-09 19:08:20.354 16376-16376/example.com.force_anr I/tag: --->>onCreate
08-09 19:08:20.354 16376-16411/example.com.force_anr I/tag: childThread:   forceclose,     :
java.lang.NullPointerException: Attempt to read from null array Thread->44839    id->44839 Thread-44839 
두 번 이나 시 도 를 한 것 같 습 니 다.Thread 가 변 했 습 니 다.그래서 이 방법 은 uncaughtException(Thread arg 0,Throwable arg 1)의 arg 0 은 이상 이 발생 한 Thread 를 말 합 니 다.uncaughtException 이 등 록 된 Thread 가 아 닙 니 다.
위 에서 말 한 것 은 편집장 님 께 서 안 드 로 이 드 포 스 클 로즈 에 나타 난 이상 원인 분석 과 해결 방법 입 니 다.여러분 께 도움 이 되 셨 으 면 합 니 다.궁금 한 점 이 있 으 시 면 댓 글로 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기