2013-09-06 2 views
1

응용 프로그램 백그라운드 서비스가 sqlite 데이터베이스를 업데이트합니다. 따라서 제 활동이 시대에 뒤 떨어지고 있습니다. 활동 의도에는 오래된 매개 변수도 들어 있으므로 onCreate, onResume은 애플리케이션을 중단시킵니다. 가장 쉬운 해결책은 전체 응용 프로그램을 다시 시작하는 것입니다. 하나의 특별한 경우를 처리하기 위해 모든 활동에 모든 onCreate, onResume 메소드에 IF를 추가하고 싶지 않습니다.System.exit (0)은 실제로 그렇게 위험한가요?

예외가 처리 된 후 ACRA 코드가 실행 된 것을 확인했습니다.

android.os.Process.killProcess(android.os.Process.myPid()); 
System.exit(10); 

그러나 많은 사람들은 System.exit(0)의 사용을 권장하지 않습니다. System.exit(0)은 정말 Android 애플리케이션의 데이터 무결성에 위험한 요소입니까? 물론 내 코드는 기존 데이터베이스를 닫을 것입니다.

업데이트 :

내가 그러나 등, 이러한 방법의 각을 finish(), 컨텐츠 제공 업체를 사용하는 방송을 보내, 여기에 SO에 많은 답변을 읽는 방법을 알고 코드의 추가 수천 라인이 필요합니다. 10 분 안에 System.exit(0)으로 솔루션을 구현했습니다. 다시 시작하는 속도가 빠르기 때문에 일반적인 startActivity 동작과 구별 할 수 없습니다. db 업데이트/다시 시작은 사용자가 더 이상 사용하지 않으면 시스템에서 이미 일시 중지됩니다. 내 앱에는 실시간 동기화가 필요하지 않습니다. 테스트 중에 응용 프로그램이 올바르게 작동합니다. 이것은 빠르고 더러운 해결책입니다.

따라서 가능한 부작용은 System.exit(0)입니다. 내가 어떻게 다르게 디자인을 할 수있는 것은 아닙니다. 나는 현재의 디자인이 완벽하지 않다는 것을 안다.

+0

[응용 프로그램을 닫고 Android에서 홈 화면 시작] 가능한 복제본 (http://stackoverflow.com/questions/2042222/close-application-and-launch-home-screen-on-android) – auselen

답변

2

System.exit(0)Java 런타임의 아티팩트이며 Android이 아닙니다. 그래서 어떤 경우 에라도 그것을 사용하는 것은 최악의 해결책이 될 것입니다.

Activity.finish()을 적절하게 사용하지 않는 이유는 무엇입니까?

거주중인 프로세스를 종료하면 캐싱 및 재시작 시간이 대부분 느슨해 지므로 (사용자의 눈으로 다시 시작 함) 다음에 시간이 많이 걸립니다.

자세한 내용은 Activity Lifecycle documentation on Android Developers을 참조하십시오.

+0

왜 투표가 늦습니까? – auselen

+0

그것은 내가 아니었지만 활동의 인스턴스가 알려지지 않을 때 OP가 활동을 닫는 메커니즘을 원하기 때문에 이것이라고 생각합니다. 아마이 활동은 방송을 처리 할 수 ​​있으며 폐쇄를 선언 할 수는 있지만 그 인프라는 잘못되었습니다. – Gusdor

+0

@Gusdor 그래서 대답은 "아니, 전화를 태우지 않을거야"와 같아야한다고 생각하니?:) – auselen

-1

사람들이 System.Exit()을 사용하는 것이 좋지 않다고 말하는 데 도움이되는 기존 답변 HERE이 있습니다.

+0

게시물 링크 만 답변. – thegrinner

+0

죄송합니다. 나는이 사실을 알지 못했습니다. –

+0

괜찮습니다. 일반적으로 댓글로 링크 전용 사항을 게시하거나 보완 자료로 사용하려고합니다. 우리는 링크 썩음 때문에 응답이 관련성을 잃어 버리는 것을 원하지 않습니다. – thegrinner

0

공구를 신중하게 사용하고 특정 목적을 위해 사용하면 위험 할 수 있습니다.

그러나 귀하의 경우에는 System.exit()이 올바른 방법이라고 생각하지 않습니다. 애플리케이션이 데이터베이스의 데이터에 의존하는 경우 애플리케이션에 변경 사항을 알리고 데이터를 업데이트하는 백그라운드 서비스를 생성하십시오. 제 생각에는 변화를 다루는 올바른 방법입니다.

System.exit()을 사용하려는 시나리오는 중대한 오류에서 복구 할 수없는 경우 개인적으로 사용하기도하지만 정상적인 성능 저하가 발생하지 않을 수 있습니다. 이러한 경우에는 응용 프로그램과 관련된 모든 리소스가 느슨한 끝을 꼬이지 않고 중단하도록하는 것이 좋습니다. 명확히하기 위해 항상 급진적 인 작업을 수행하기 전에 오류 처리를 사용해야합니다. 적절한 오류 처리가 자주 발생합니다.

그러나 이것은 매우 섬세한 주제이며, 꽤 많은 다른 답변을 얻을 수 있습니다.

+0

System.exit()에는 스레드를 임의로 죽이는 것과 같은 이유로 적용됩니다. 대청소. – Gusdor

+0

클린업은 임의로 스레드를 죽이지는 않지만 적어도 그렇게해서는 안됩니다. 메모리 사용 및 활동과 같은 매개 변수 세트를 기반으로 스레드를 선택해야합니다. 물론 어떤 경우에는 최선의 선택이 무작위로 선택 될 수 있습니다. 그러나 그때조차도, 신중하게 결정을 내렸고 목적을 지녀야했습니다. 결론은 당신이 게으르거나 불가능한 상황에 처해 있기 때문에 결코 System.exit()를 사용해서는 안된다는 것입니다. – Eric

1

프로세스를 죽이면 프로세스 외부의 등록 된 리소스가 정리되지 않습니다. 예를 들어 BroadcastReceivers. 이것은 누출이며 장치가 알려줄 것입니다.

백그라운드 서비스에서 데이터베이스를 정말로 업데이트하면 안됩니다. 활동이 재개 될 때해라.

데이터를 방금 업데이트하는 경우 활동을 다시 시작하면 의도로 지정한 데이터의 유효성을 검사하고 예를 들어 항목 X가 더 이상 존재하지 않는다고 사용자에게 알려야합니다.

0

따라서 내 활동이 시대에 뒤 떨어지고 있습니다.

ContentProviderContentObserver (또는 Loader 프레임 워크)를 사용하거나 현장에서 활동 를 업데이트 메시지 버스 (LocalBroadcastManager, 오토 등)를 사용합니다.

활동 의도도에서 onCreate 너무 오래된 PARAMS를 포함, onResume 응용 프로그램

복사 활동의 데이터 멤버에 관련 "PARAMS을"충돌합니다. 필요에 따라 해당 데이터 멤버를 업데이트하십시오 (예 : 메시지 버스 제기 이벤트의 핸들러에서). 구성 변경을 위해 인스턴스 상태의 일부로 해당 데이터를 고정하십시오 (예 : onSaveInstanceState()). 쉬운 솔루션은 전체 응용 프로그램을 다시 시작하는 것입니다 onCreate()에서이 데이터 onResume()

를 사용

그것은 사용자가 자발적으로 귀하의 응용 프로그램을 감사하지 않습니다 당신이, 사용자의 가치를하는 경우가 아닌 가장 쉬운 방법입니다 그들이 그것을 사용하는 동안 증발. 이메일이 올 때마다 Gmail이 자신의 앱을 다운 시킨다고 생각하십니까?

다음으로 웹 페이지를 업데이트하는 방법을 알아낼 수 없기 때문에 일부 익스플로잇을 사용하여 브라우저를 크래시하는 웹 응용 프로그램을 작성해 보겠습니다.

예외가 처리 된 후 ACRA에 다음 코드가 실행 된 것으로 나타났습니다.

최상위 예외 핸들러 코드의 종류가 할 수있는 유일한 합리적인 장소에 대해, 그리고이 코드가 실행되지 않을 때까지, 심지어 거기 목적은 (즉, 처리되지 않은 예외가없는)입니다.

+0

질문 업데이트를 읽어보십시오. 내 경쟁자 중 실시간 또는 백그라운드 업데이트가 전혀 없습니다. 왜냐하면 그들은 필요하지 않기 때문입니다. 이것들은 제가 집중해야 할 다른 중요한 기능들입니다. –

+0

@GregDan : "그러나 이러한 각 접근법에는 추가로 수천 줄의 코드가 필요합니다"- 데이터베이스를 사용하는 활동/조각 당 두 줄의 행을 추가해야하며, 업데이트 자체를 수행하는 시점에서 몇 줄을 추가해야합니다 . 수백 가지 활동/파편이 포함 된 앱을 사용하는 경우 다른 문제가 있습니다. – CommonsWare