반응형
안드로이드 개발 비정상 종료시 에러 남기는 방법 |
환경: Android Studio |
앱의 비정상적인 오류로 인해 종료되는 시점에서 사용자가 별도의 기능을 처리할 수 있을 까요? 모든 소스에 try catch 를 씌울 수도 있겠지만 비효율적입니다. java 는 스레드 객체에서 비정상적인 오류가 발생하면 UncaughtException 이벤트를 실행합니다. 안드로이드는 java 언어를 기반으로 만들어 졌기 때문에 UncaughtException 이벤트를 받을 수 있는 핸들러 등록이 가능합니다.
▼ 기본 사용법은 Thread.UncaughtExceptionHandler 핸들러를 Thread static 함수인 setDefaultUncaughtExceptionHandler() 에 등록하는 것입니다. 그러면 비정상적으로 종료하는 순간 이벤트를 받을 수 있습니다.
▼ UncaughtException 은 Thread 별로 관리가 가능하기 때문에 각 Activity 마다 등록이 가능합니다. 샘플에서는 나누기 에러를 이용해서 Thread.UncaughtExceptionHandler 를 통해 이벤트를 받아 로그를 출력했습니다.
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; public class UncaughtExceptionActivity extends AppCompatActivity { private String TAG = UncaughtExceptionActivity.class.getSimpleName(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_uncaught); Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler()); int a = 10 / 0; } public class UncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { @Override public void uncaughtException(Thread thread, Throwable ex) { // 이곳에서 로그를 남기는 작업을 하면 된다. Log.e(TAG, "error -----------------> " + ex.toString()); // 종료 android.os.Process.killProcess(android.os.Process.myPid()); System.exit(10); //androidDefaultUEH.uncaughtException(thread, ex); } } }
▼ 앱 전체에서 발생하는 예외를 처리하기 위해서는 Application 에 등록을 해야 합니다. 먼저 Application 상속받아서 자신만의 클래스를 만듭니다. 그리고 AndroidManifest.xml 에 등록합니다.
▼ 등록한 Application 클래스의 전체 내용은 다음과 같습니다.
import android.app.Application; import android.util.Log; public class MyApplication extends Application { private String TAG = MyApplication.class.getSimpleName(); private Thread.UncaughtExceptionHandler androidDefaultUEH; private UncaughtExceptionHandler uncaughtExceptionHandler; public UncaughtExceptionHandler getUncaughtExceptionHandler() { return uncaughtExceptionHandler; } @Override public void onCreate() { androidDefaultUEH = Thread.getDefaultUncaughtExceptionHandler(); uncaughtExceptionHandler = new UncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(uncaughtExceptionHandler); super.onCreate(); } public class UncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { @Override public void uncaughtException(Thread thread, Throwable ex) { // 이곳에서 로그를 남긴다 Log.e(TAG, "error -----------------> " + ex.toString()); android.os.Process.killProcess(android.os.Process.myPid()); System.exit(10); } } }
반응형
'안드로이드 개발' 카테고리의 다른 글
안드로이드(Android) 삼성 갤럭시 에뮬레이터 테스트 다운받아 이용하기 (0) | 2019.06.06 |
---|---|
안드로이드(Android) 다이얼로그 Dialog 텍스트 링크 거는 방법 (0) | 2019.05.07 |
안드로이드 개발 로그인 화면 간단하게 만드는 방법 (0) | 2019.03.23 |
안드로이드(Android) 리스트뷰(ListView) Header, Footer 레이아웃 추가하는 방법 (0) | 2019.01.31 |
개발자들을 위한 공유 API 스토어 사이트 (0) | 2019.01.20 |
안드로이드(Android) ListView 멀티, 싱글 설정과 선택한 데이터 가져오는 방법 (4) | 2019.01.07 |
안드로이드 개발 FragmentTransaction replace argument type 에러 (0) | 2018.12.14 |
안드로이드(Android) 현재 연결은 사용자의 호스트 시스템의 소프트웨어의 의해 중단되었습니다. 에러 났을 때 (0) | 2018.11.28 |