앱으로 돌아갈 때 정적 변수 null
내 앱에는 외부 브라우저에서 내 앱으로 돌아갈 때 null로 설정되는 정적 변수가 있습니다. 내가 시작하는 외부 웹 페이지가 충분히 복잡한 경우 앱 또는 일부가 종료 된 것 같습니다.
앱이 완전히 종료 된 다음 기본 활동에서 다시 실행되지만 브라우저를 시작한 활동에서 다시 실행되는 경우-앱 상태를 설정하는 것이 아니므로 null 정적 변수에 액세스 할 때 충돌이 발생합니다. . 이것은 나에게 하나의 장치 문제이므로 조언이 필요합니다.
이 동작을 방지하기 위해 설정할 플래그가 있습니까?
이것은 확실히 Android를 포함한 대부분의 모바일 운영 체제에서 표준 동작입니다. 실제로 우선 순위가 더 높은 다른 응용 프로그램 (일반적으로 포 그라운드에있는 경우 우선 순위가 더 높음)에 리소스가 필요한 경우 앱 이 매우 자주 종료됩니다. 이는 상대적으로 제한된 리소스를 가진 모바일 장치의 특성 때문입니다.
데이터를 더 내구성있는 곳에 저장해야합니다. 일반 데이터 저장소 에 대한이 문서 가 유용 할 수 있습니다. 이 질문도 관련이 있어야합니다. 인스턴스 상태 저장을 사용하여 Android 활동 상태 저장
참고이 사실이라고 하지 한 - 아웃 - 오브 - 여섯 장치 문제. 이것은 모든 장치에서 "문제" 이며 메모리가 적기 때문에 장치 중 하나에서 더 분명합니다. 다른 장치에서 매우 메모리 집약적 인 앱을 실행하는 경우 동일한 동작이 표시되어야합니다. 또한이를 방지하는 플래그가 없습니다. 이것은 표준이며 예상됩니다.
일반적으로 이것은 장치가 절전 모드로 전환 될 때 발생 합니다 .
장치의 이러한 동작은 다음 단계를 통해 에뮬레이션 할 수 있습니다.
- 앱을 실행하고 홈 버튼을 누릅니다.
- 왼쪽 하단의 Android Studio에서 debugged the application을 선택하고 애플리케이션 이름 왼쪽에있는 X 버튼 (애플리케이션 종료)을 누릅니다. (Eclipse 방법을 모르지만 비슷한 생각)
- 장치 에서 응용 프로그램 아이콘 을 클릭 합니다 .
작업이 활동 인 경우 모든 정적 변수가 그대로 두었 기 때문에 앱이 마지막 활동에서 열리고 (대부분) 오류가 생성됩니다 .
아니요 ... Android의 정적 변수에 데이터를 저장하면 안됩니다. 당신이 그것을 고집한다면 당신은 그것이 null 일 때 그것을 회복 할 수 있어야 할 것이다. 당신은 번들이나 다른 수단으로 당신의 상태를 저장해야한다.
Android에서 정적 (싱글 톤)을 사용하는 솔루션은 매우 쉽습니다.
확장 android.app.Application
하고 모든 싱글 톤 초기화를 수행 하는 클래스를 구현 하십시오.onCreate()
추리:
- 메모리 부족으로 인해 앱의 프로세스가 종료 된 경우에도 Application을 확장하는 클래스가 먼저 실행됩니다.
- Application.onCreate ()가 호출 되 자마자 앱에 컨텍스트가 있습니다.
활동이 중지 된 상태 수명 주기로 이동하면 모든 정적 값이 null이되므로 onSaveInstanceState에 값을 저장하고 onRestoreInstanceState에 다시 가져와야합니다.
예 :
/* save my satatic hashmap in case of activity stopped to retrieve it again in onRestoreInstanceState method*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//Common.PERMISION_MAP static hashmap
if (Common.PERMISION_MAP != null) {
Iterator<Permission> iterator = Common.PERMISION_MAP.values()
.iterator();
ArrayList<Permission> permissionList = new ArrayList<Permission>();
while (iterator.hasNext()) {
Permission permission = (Permission) iterator.next();
permissionList.add(permission);
}
outState.putParcelableArrayList("PERMISSION_LIST", permissionList);
}
}
/* restore my satatic hashmap when activity stopped */
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
try {
ArrayList<Permission> permissionList = savedInstanceState
.getParcelableArrayList("PERMISSION_LIST");
if (Common.PERMISION_MAP == null)
Common.PERMISION_MAP = new HashMap<Permission, Permission>();
for (Permission permission : permissionList) {
Common.PERMISION_MAP.put(permission, permission);
}
} catch (Exception ex) {
String string = ex != null ? ex.getMessage() : "";
Log.e(TAG, (string != null ? string : ""));
ex.printStackTrace();
}
}
가부 코의 두 번째 링크를 따르고 싶을 것입니다. 그러나 정적 변수를 유지하려면 (아마도 이에 대한 큰 이유가있을 수 있음) 다음과 같이 할 수 있습니다.
private static MyObjType getVariable()
{
if (myVar == null)
myVar = new MyObjType(); // do whatever else you need to here
return myVar;
}
이렇게하면 myVar.test ()에 대한 호출을 getVariable (). test ()로 대체 할 수 있으며 널 포인터 예외가 발생하지 않는다는 것을 알 수 있습니다.
그런 일에 응용 클래스를 사용하십시오. 앱의 구성 요소 (활동, 서비스, 수신기)가 시작되기 전에 항상 인스턴스화됩니다. 따라서 모든 정적 변수가 있고 초기화되었는지 확인합니다.
앱을 종료하고 브라우저를 전환 할 때마다 앱이 백그라운드에 있습니다. 따라서 다음 단계를 따라야합니다.
First initialize your static variable in Sharedpreferece or in savedInstanceState as follow
sharedpreference.purString("your_static_variable_name","your_static_variable_value").
or
savedInstanceState.putString("your_static_variable_name","your_static_variable_value").
in the first execution of oncreate()
method of activity or elsewhere
- Second, reinitialize your static variables in
onResume()
methods via sharedpreference or savedInstance whichever is used earlier.
ReferenceURL : https://stackoverflow.com/questions/9541688/static-variable-null-when-returning-to-the-app
'developer tip' 카테고리의 다른 글
문서에서 일부 필드를 제외하는 방법 (0) | 2021.01.05 |
---|---|
첫 번째 명령 이후에 종료하지 않고 배치 파일에서 여러 git 명령을 실행하려면 어떻게해야합니까? (0) | 2020.12.31 |
Nuget repositories.config 파일은 무엇입니까? (0) | 2020.12.31 |
ASP.NET MVC에서 기본 JSON serializer 설정 (0) | 2020.12.31 |
Firebase로 여러 소셜 서비스에 로그인하려면 어떻게해야합니까? (0) | 2020.12.31 |