프로그램 이상 처리에 대한 분석 - 시작부터 초월까지

여러분이 일부 소프트웨어를 사용할 때 붕괴되기 전에 몇 가지 대화상자가 나타날 것이라고 믿습니다. 예를 들어 "프로그램이 종료되면 오류 로그를 보내면 우리가 문제를 더욱 잘 해결할 수 있습니다!"이 응용 프로그램들은 어떻게 처리합니까?
이른바'지혜로운 사람은 천 번 생각해도 반드시 실수가 있다'는 것이다.안드로이드에서는 빈 포인터 이상, 프로그램 이상 종료 등과 관련된 문제가 적지 않았을 것이다.설령 디버깅에 성공했다 하더라도 사용자의 조작이 새로운 문제를 일으키지 않을 것이라고 보장하기는 매우 어렵다.이런 FC(force close) 문제에 대해 우리는 지금'우둔한 자는 천 번 생각하면 반드시 한 가지 얻는 것이 있다'는 역습을 살펴보자! 
[1] 시작 편
이전 코드:
4
public class Myapp extends Application {

	@Override
	public void onLowMemory() {
		
		super.onLowMemory();
		Intent intent= new Intent();
		intent.setAction("kill other process");
		sendBroadcast(intent);
	}

}
응용 프로그램의 관련 조작이 필요하기 때문에 계승하는 새로운 종류를 먼저 정의한다.
Application 클래스.계승류 다음에 이 예에서 가장 간단한 오류 해결 방법을 살펴보자.
onLowMemory () 는 말 그대로 낮은 메모리 상태에서 프로그램이 실행하는 방법을 건드리는 것이다.이 방법은 일반 좌우의 문제를 모두 해결했다고 말할 수 있다.
이 예에서 우리는 먼저 라디오 수신자를 등록하고 Filter에서 하나의 동작(이곳은 "kill other process")을 지정한다. 낮은 메모리에서 방송을 보내고 계승 방송의 클래스에서 방송을 받은 후의 방법을 정의한다. 예를 들어 백엔드 프로세스를 죽이거나 다른 방법을 지정할 수 있다.
【2】동기편
기본적인 문제 처리를 할 줄 알았으니 남은 문제는?예를 들어 프로그램의 빈 바늘이 이상한 문제를 가지고 있지만, 현재 우리는 여전히 그것을 처리하지 않는다.이제 계승해야 할 또 다른 방법을 살펴보자. 온크리트 ().이 방법은 우리가 잘 알고 있다. 이것은 확실히 예상한 바와 같이 프로그램이 처음 실행될 때 시작하는 방법이다.
이렇게 해서 우리는 많은 초기화 작업을 그 중에서 실행할 수 있다는 것을 알게 되었다.다른 문제를 철저히 해결하려면 UncaughtExceptionHandler의 인터페이스를 실현하기 위해 클래스를 새로 만들어야 한다.이 인터페이스는lang 아래의 라인에 있습니다 (import java.lang.Thread.UncaughtExceptionHandler).우리는 여전히 코드로부터 착수한다.코드를 보십시오.
public class MyCrashHandler implements UncaughtExceptionHandler {
  
	private MyCrashHandler(){
	  
  }
	//          ,syschronized                    ,      
	private static MyCrashHandler myCrashHandler;
	
	public static synchronized MyCrashHandler getInstance(){
		if(myCrashHandler==null){
			myCrashHandler=new MyCrashHandler();
		}
		return myCrashHandler;
		
	} 
	
	
	public void uncaughtException(Thread arg0, Throwable arg1) {
		System.out.println("    FC");
		android.os.Process.killProcess(android.os.Process.myPid());

	}

}

인터페이스 중 하나를 구현하는 방법:
public void uncaughtException(Thread arg0, Throwable arg1)
여기에서 우리는 컨트롤러에 로그를 인쇄하고 안드로이드 프로세스 관리 메커니즘을 이용하여 현재 프로세스를 죽인다.또한 하나의 클래스만 만드는 실례를 확보하기 위해 우리는 구조 방법을 사유화하고 자바의synchronized 키워드를 이용하여 프로세스 잠금을 실현한다.이렇게 하면 클래스의 실례 대상을 만들 때 한꺼번에 getInstance () 방법으로만 진행할 수 있음을 보장할 수 있다.
자, 다시 My app 클래스로 돌아가서 onCreat () 방법을 쓰십시오
public class Myapp extends Application {
//              UncrashExceptionHandler
	@Override
	public void onCreate() {
		
		super.onCreate();
		MyCrashHandler myCrashHandler= MyCrashHandler.getInstance();
		Thread.currentThread().setUncaughtExceptionHandler(myCrashHandler);
	}
     
}

getInstance () 방법을 호출하여 uncaughtException 방법을 실현한 대상을 되돌려줍니다.우리는 코드를 사용하여 프로그램이 있는 현재 프로세스에 연결합니다.
Thread.currentThread().setUncaughtExceptionHandler(myCrashHandler)
[3] 초월편
현재 우리는 거의 발생할 수 있는 모든 문제를 다 고려했다.그러나 만약에 다른 우연한 요소가 나타날 때나 프로그램이 종료된 후에 우리는 오류 로그를 얻어 사용자가 오류 로그를 프로그램이 있는 서버에 업로드하도록 해야 한다. 또 어떻게 해야 합니까?안드로이드 엔지니어가 사용자 정보를 얻을 수 있는 방법을 제공해 주셔서 기쁩니다.
여전히 코드:
4
StringBuilder sb = new StringBuilder();
		// 1.            .
		PackageManager pm = context.getPackageManager();
		try {
			PackageInfo packinfo = pm.getPackageInfo(context.getPackageName(),
					0);
			sb.append("       " + packinfo.versionName);
			sb.append("
"); // 2. . Field[] fields = Build.class.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { // , fields[i].setAccessible(true); String name = fields[i].getName(); sb.append(name + " = "); String value = fields[i].get(null).toString(); sb.append(value); sb.append("
"); } // 3. . StringWriter writer = new StringWriter(); PrintWriter printWriter = new PrintWriter(writer); ex.printStackTrace(printWriter); String result = writer.toString(); sb.append(result); System.out.println(sb.toString()); // 4. uploadtoHttp(sb); } catch (Exception e) { e.printStackTrace(); } // android.os.Process.killProcess(android.os.Process.myPid()); }
이상의 코드를 분석한 결과 우리는 먼저 패키지 관리자(Package Manager)를 받은 다음에 호출한 것을 발견하기 어렵지 않다.
getPackageInfo 메서드, 잘못된 버전과 같은 소프트 정보를 얻습니다.
안드로이드에서 모든 하드웨어 정보를 Build로 포장했습니다.class.getDeclaredFields () 에서 호출하면 Field의 그룹을 되돌려주고 모든 정보를 되돌려줍니다.이어서 모든 Field의 문자열을 Stringbuilder에 직접 연결합니다.그런 다음 ex.printStackTrace(printWriter)로 잘못된 스택 정보를 가져옵니다.필요하면 이 정보를 서버에 함께 보낼 수도 있다.이렇게 하면 엔지니어는 오류에 대해 진일보한 통계 분석을 하고 제품에 대해 최적화를 할 수 있다.
OK, 이제 큰일 났어. 앱이 많이 건강해진 것 같지 않아~

좋은 웹페이지 즐겨찾기