|
안드로이드 개발 비정상 종료시 에러 남기는 방법 |
|
환경: 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 |

