2013-02-01 2 views
0

한 명의 고객이 Task Killer로 앱을 종료 한 후 시작시 내 앱 강제 종료에 대한 의견을 저에게 보냈습니다. 나는 태스크 킬러가 위험하고 안드로이드가 윈도우를 RAM으로 관리하지 않기 때문에 폰 성능에 아무런 도움이되지 않는다고 말했다.하지만 그는 태스크 킬러를 제거하지 않을 것이다.앱을 작업 완료 한 후 Force Close 시작

는 강제 닫기는 다음과 같이 진행됩니다

A) 사용자가 내 응용 프로그램 일반적으로

B) 사용자 작업이 내 응용 프로그램을 죽이고을 사용

C)는 사용자가 내 응용 프로그램을 다시

D)을 출시 시작시 강제 닫기

E) 사용자가 내 앱을 다시 시작합니다.

F) 모든 것이 의도 한대로 작동합니다.

RAM에서 지워지므로 내 정적 객체가 null이되고, 응용 프로그램을 강제 종료하는 NullPointerExceptions가 발생하므로 문제가 있다는 것을 발견했습니다. 그러나 정적 인 객체를 사용하고있는 곳이 많습니다 (정적 객체를 사용하지 않는 경우) NullPointerExceptions이 많은 곳에서 발생할 수 있습니다.

이 동작은 Android 2.3.7 이하에서만 발생합니다. 안드로이드 4.0의 자체 작업 킬러 (길게 누르는 홈으로 접근 할 수있는 것)는 앱을 올바르게 죽인 다음 강제 종료없이 실행합니다.

어떻게이 동작을 피할 수 있습니까?

+0

앱 로그와 시작 코드를 입력하십시오. –

+0

그는 로그를 제출하지 않았지만 기본적으로 앱이 일시 중지 된 위치에서 실행하려고 시도하며 정적 개체를 가져 오려고 할 때마다 NPE와 강제 종료가 종료됩니다. 중요한 문제는 예외가 같은 장소에서 결코 잡히지 않는다는 것입니다. 사용자가 마지막으로 방문한 활동을 던져서 예외 처리를 더욱 어렵게 만듭니다. – razielsarafan

+0

앱 코드가 있습니까? Log.e 또는 Log.d를 통해 로그를 얻은 다음 여기에 게시하십시오. 아무도 당신을 도울 수있는 그렇지 않으면 몇 가지 코드를 넣어. –

답변

0

해결했습니다.

이 솔루션은 최적은 아니지만 작동 :

나는이 같은 인터페이스를 생성 :

public void getWhatever(StaticAccessTo<Whatever> callback){ 
    if (whatever == null){ 
     loadWhateverFromServer(callback); 
    } else { 
     callback.returnStatic(whatever); 
    } 
} 

private void loadWhateverFromServer(StaticAccessTo<Whatever> callback){ 
    new AsyncTask<Void,Void,Void>(){ 

    public Void doInBackground(Void... params){ 
     whatever = loadWhatever(); 
     return null; 
    } 

    public void onPostExecute(Void result){ 
     callback.returnStatic(whatever); 
    } 

    }.execute(); 
} 
: 내 정적 객체의 게터를하는 대신

public interface StaticAccessTo<T>{ 
    public void returnStatic(T object); 
} 

을,이이

whatever이 null이 아니면 즉시 returnStatic(whatever)을 호출하고 주 스레드에서 whatever에 액세스 할 수 있습니다. 그렇지 않으면 네트워크에서 자동으로로드되고 returnStatic(whatever)이로드 될 때 메인 스레드에서 호출합니다.