developer tip

앱으로 돌아갈 때 정적 변수 null

optionbox 2020. 12. 31. 08:13
반응형

앱으로 돌아갈 때 정적 변수 null


내 앱에는 외부 브라우저에서 내 앱으로 돌아갈 때 null로 설정되는 정적 변수가 있습니다. 내가 시작하는 외부 웹 페이지가 충분히 복잡한 경우 앱 또는 일부가 종료 된 것 같습니다.

앱이 완전히 종료 된 다음 기본 활동에서 다시 실행되지만 브라우저를 시작한 활동에서 다시 실행되는 경우-앱 상태를 설정하는 것이 아니므로 null 정적 변수에 액세스 할 때 충돌이 발생합니다. . 이것은 나에게 하나의 장치 문제이므로 조언이 필요합니다.

이 동작을 방지하기 위해 설정할 플래그가 있습니까?


이것은 확실히 Android를 포함한 대부분의 모바일 운영 체제에서 표준 동작입니다. 실제로 우선 순위가 더 높은 다른 응용 프로그램 (일반적으로 포 그라운드에있는 경우 우선 순위가 더 높음)에 리소스가 필요한 경우 매우 자주 종료됩니다. 이는 상대적으로 제한된 리소스를 가진 모바일 장치의 특성 때문입니다.

데이터를 더 내구성있는 곳에 저장해야합니다. 일반 데이터 저장소 에 대한이 문서 가 유용 할 수 있습니다. 이 질문도 관련이 있어야합니다. 인스턴스 상태 저장을 사용하여 Android 활동 상태 저장

참고이 사실이라고 하지 한 - 아웃 - 오브 - 여섯 장치 문제. 이것은 모든 장치에서 "문제" 이며 메모리가 적기 때문에 장치 중 하나에서 더 분명합니다. 다른 장치에서 매우 메모리 집약적 인 앱을 실행하는 경우 동일한 동작이 표시되어야합니다. 또한이를 방지하는 플래그가 없습니다. 이것은 표준이며 예상됩니다.


일반적으로 이것은 장치가 절전 모드로 전환 될 때 발생 합니다 .

장치의 이러한 동작은 다음 단계를 통해 에뮬레이션 할 수 있습니다.

  1. 앱을 실행하고 홈 버튼을 누릅니다.
  2. 왼쪽 하단의 Android Studio에서 debugged the application을 선택하고 애플리케이션 이름 왼쪽에있는 X 버튼 (애플리케이션 종료)을 누릅니다. (Eclipse 방법을 모르지만 비슷한 생각)
  3. 장치 에서 응용 프로그램 아이콘 클릭 합니다 .

작업이 활동 인 경우 모든 정적 변수가 그대로 두었 기 때문에 앱이 마지막 활동에서 열리고 (대부분) 오류가 생성됩니다 .


아니요 ... 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 ()로 대체 할 수 있으며 널 포인터 예외가 발생하지 않는다는 것을 알 수 있습니다.


그런 일에 응용 클래스를 사용하십시오. 앱의 구성 요소 (활동, 서비스, 수신기)가 시작되기 전에 항상 인스턴스화됩니다. 따라서 모든 정적 변수가 있고 초기화되었는지 확인합니다.


앱을 종료하고 브라우저를 전환 할 때마다 앱이 백그라운드에 있습니다. 따라서 다음 단계를 따라야합니다.

  1. 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

  1. 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

반응형