2014-11-30 8 views
2

캐치되지 않은 예외가 표시되면 일부 작업을 수행해야하는 Android 라이브러리에서 작업하고 있습니다.UncaughtExceptionHandler를 사용하여 Android가 일반적으로 수행하는 작업과 필요한 추가 기능을 수행합니다.

잡히지 않은 예외 핸들러를 성공적으로 설정하고 웹 서버에 정보를 게시하는 데 필요한 코드를 실행하고 있지만, 내 부분이 완료된 후 앱이 안드로이드가 일반적으로 수행하는 작업 (예 : 표시)을 원합니다. 앱이 다운 된 후 앱이 종료되었음을 알리는 대화가 표시되고 Google Play 개발자 콘솔에 세부 정보가 게시됩니다.

당분간 내 잡히지 않은 예외가 서버에 성공적으로 게시되지만 응용 프로그램이 계속 실행되지만 스레드가 파티가 사라지면 기묘한 상태로 유지됩니다. 일반적으로 알려지지 않은 예외가 throw되면 Android가 앱을 종료합니다. 다음은

가 내 캐치되지 않는 예외 핸들러를하고있는 중이 야 방법은 다음과 같습니다

private static void setUnhandledExceptionHandler() 
    { 
     Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() 
     { 
      @Override 
      public void uncaughtException(final Thread thread, final Throwable) { 
       CrashReporter.ReportUnhandledCrash(((Exception) ex)); 
       Looper.loop(); 
      } 
     }); 
    } 

Bascially, 내 처리되지 않은 예외 처리기를 통해 내 서버에, 내 응용 프로그램 게시를하면된다 다음 응용 프로그램을 종료하고 싶은, Android가 일반적으로하는 것과 같은 방식으로, 강제로 close 오류를 표시하고 앱을 닫습니다.

도움을 주셔서 감사합니다.

+0

당신의 질문은 무엇입니까의 하나입니다? –

+0

죄송합니다. 명확하지 않았습니다. 내 질문을 업데이트했습니다. – Boardy

답변

3

GoogleAnalytics로 추적 할 때 비슷한 문제가있었습니다. 대부분의 예외는 기본 처리기에서보고하려고 할 때 없어졌습니다. 그래서 나는 그들을 캐쉬하고 다음 시작시에 그들을보고했다.

'old'DefaultUncaughtExceptionHandler를 저장하고 예외를 전달해야하는 것처럼 두 번째 트릭 (그리고이 질문에 대한 답변으로)이 응용 프로그램을 중단시킬 수 있습니다.

아래에서 onCreate 방법은 내 응용 프로그램 클래스

@Override 
public void onCreate() 
{ 
    super.onCreate(); 
    trackCachedException(); 
    setupExceptionHandling(); 
} 


private void setupExceptionHandling() 
{ 
    _systemExceptionHandler = Thread.getDefaultUncaughtExceptionHandler(); 
    Thread.UncaughtExceptionHandler myHandler = new Thread.UncaughtExceptionHandler() 
    { 

     @Override 
     public void uncaughtException(Thread thread, Throwable ex) 
     { 
      cacheException(thread.getName(), ex); 
      if (_systemExceptionHandler != null) 
      { 
       _systemExceptionHandler.uncaughtException(thread, ex); 
      } 
     } 
    }; 
    // Make myHandler the new default uncaught exception handler. 
    Thread.setDefaultUncaughtExceptionHandler(myHandler); 
} 
+0

감사합니다.이 기능은 완벽하게 작동합니다. – Boardy

0

유일한 방법은 당신이 청소도 기분도 아니다 할 수있는 방법을 볼 수 있습니다, 그래서 우리가 시작하기 전에 미안 말할거야 ...

작업의 순서는 다음과 같습니다

  1. 스토어 잡히지 않는 예외
  2. 이전처럼이 예외를 기록하십시오.
  3. null로 set 메소드를 호출하여 캐치되지 않는 예외 핸들러를 등록 취소하십시오.
  4. 저장된 예외를 throw하는 새 스레드를 시작하십시오.

실제로 동일한 예외가 두 번 발생하지만 두 번째 throw에서 복구 메커니즘이 제거됩니다.