programing

Shared Preferences에서 commit()와 apply()의 차이점은 무엇입니까?

padding 2023. 6. 2. 20:12
반응형

Shared Preferences에서 commit()와 apply()의 차이점은 무엇입니까?

는 사용중을 하고 있습니다.SharedPreferences내 안드로이드 앱에서.는 둘다사니다합용다 둘 다 .commit()그리고.apply()공유 기본 설정의 메서드입니다.하면 오류가, 하면 AVD 2.3은 AVD 2.3, AVD 2.1은 AVD 2.1입니다.apply()메서드가 오류를 표시합니다.

그렇다면 이 둘의 차이점은 무엇일까요?그리고 사용만 하면 됩니다.commit()선호도 값을 문제없이 저장할 수 있습니까?

apply()2.3에 추가되었으며 성공 또는 실패를 나타내는 부울을 반환하지 않고 커밋됩니다.

commit()저장이 작동하면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

apply()Android 개발 팀이 거의 아무도 반환 값에 주목하지 않는다는 것을 알아차리면서 추가되었습니다. 따라서 비동기식이기 때문에 적용이 더 빠릅니다.

http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply()

tl;dr:

  • commit()데이터를 동기적으로 씁니다(호출된 스레드 포함).그런 다음 작업의 성공 여부를 알려줍니다.
  • apply()데이터가 비동기적으로 기록되도록 예약합니다.작업의 성공 여부는 알려주지 않습니다.
  • 으로 저장하는 apply()getX-method를 통해 즉시 판독하면 새 이 반환됩니다!
  • 에 하셨다면.apply()어떤 시점에서, 그리고 그것은 여전히 실행 중이고, 어떤 전화도.commit()과거의 모든 적용 요청과 현재의 커밋 호출이 완료될 때까지 차단됩니다.

Shared Preferences(공유 기본 설정)에서 자세한 내용을 확인할 수 있습니다.편집기 설명서:

기본 설정을 영구 스토리지에 동기적으로 쓰는 commit()는 달리 apply()는 메모리 내 Shared Preferences에 변경 사항을 즉시 커밋하지만 디스크에 대한 비동기 커밋을 시작하므로 오류에 대한 알림이 표시되지 않습니다.apply()가 아직 처리되지 않은 상태에서 이 SharedPreferences의 다른 편집자가 정기적으로 commit()를 수행하면 커밋 자체뿐만 아니라 모든 비동기 커밋이 완료될 때까지 commit()이 차단됩니다.

SharedPreferences 인스턴스는 프로세스 내의 싱글톤이므로 이미 반환 값을 무시하고 있었다면 commit() 인스턴스를 apply()로 바꾸는 것이 안전합니다.

공유 기본 설정.편집기 인터페이스는 직접 구현되지 않을 것으로 예상됩니다.그러나 이전에 구현한 경우 apply() 누락에 대한 오류가 발생하면 apply()에서 commit()을 호출하면 됩니다.

commit() 대신 apply()를 사용하여 문제를 겪고 있습니다.앞서 다른 응답에서 언급했듯이 apply()는 비동기식입니다."문자열 집합" 기본 설정으로 구성된 변경 내용이 영구 메모리에 기록되지 않는다는 문제가 발생했습니다.

이는 프로그램을 "강제 억류"하거나 Android 4.1이 설치된 내 장치에 설치된 ROM에서 메모리 요구로 인해 프로세스가 시스템에 의해 중지된 경우에 발생합니다.

기본 설정을 활성화하려면 "apply()" 대신 "commit()"을 사용하는 것이 좋습니다.

apply()를 사용합니다.

변경 사항을 즉시 RAM에 기록하고 대기한 후 내부 저장소(실제 기본 설정 파일)에 기록합니다.커밋은 변경사항을 파일에 직접 동기화하여 기록합니다.

  • commit()synchronous, 있습다니어되화동기▁synchron.apply()입니다.

  • apply()무효 함수입니다.

  • commit()새 값이 영구 스토리지에 성공적으로 기록된 경우 true를 반환합니다.

  • apply()은 상태 에 완료되므로 구성 요소 주기에 걱정할

에서 반환된 값을 하지 않는 우지는않에서 반환된 합니다.commit()그리고 당신은 사용하고 있습니다.commit()주스드에서, 용사레를 합니다.apply()commit()

이 문서는 와 의 차이에 대해 꽤 잘 설명합니다.

와는과 다르게 .commit()는 영구 에 대한 기본 을 동기화하여 합니다.apply() 변경사커밋합니로 변경을 커밋합니다.SharedPreferences디스크에 대한 비동기 커밋을 시작하면 장애에 대한 알림이 표시되지 않습니다.만약 이것에 대한 다른 편집자라면.SharedPreferences으로 commit()▁a.apply()인 여히미상태니다입해결전▁is▁the▁still.commit()모든 비동기 커밋과 커밋 자체가 완료될 때까지 차단됩니다.~하듯이SharedPreferences이며, 할 수 있습니다.commit()와 함께apply()이미 반환 값을 무시한 경우.

commit()와 apply()의 차이

Shared Preference를 사용할 때 이 두 용어로 인해 혼동될 수 있습니다.기본적으로 동일할 수 있으므로 commit()의 차이점을 명확하게 하고 적용()하겠습니다.

1. 반환 값:

apply()성공 또는 실패를 나타내는 부울을 반환하지 않고 커밋합니다. commit( 않으면 를 반환합니다.) 저장이 작동하면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

  1. 속도:

apply()더 빠릅니다. commit()속도가 느립니다.

  1. 비동기 V.S.동기화:

apply()commit()

  1. 원자:

apply() 발전소commit() 발전소

  1. 오류 알림:

apply()아니요commit()

javadoc에서:

기본 설정을 영구 스토리지에 동기적으로 쓰는 commit()과는 달리 apply()는 메모리 내 Shared Preferences에 변경 사항을 즉시 커밋하지만 디스크에 대한 비동기 커밋을 시작하므로 오류에 대한 알림이 표시되지 않습니다.> apply()가 아직 미결 상태인 동안 이 Shared Preferences의 다른 편집자가 정기적인 커밋()을 수행하면 커밋 자체뿐만 아니라 모든 비동기 커밋이 완료될 때까지 커밋()이 차단됩니다.

웹 API로 작업하는 동안 로그아웃하기 전에 공유 기본 설정을 사용할 때 apply()의 주요 단점을 발견했습니다.

다음 시나리오를 확인합니다.사용자 로그인 및 토큰(자동 재로그용)이 POST와 함께 전달되었습니다.

SharedPreferences preferences = App.getContext().getSharedPreferences("UserCredentials", Context.MODE_PRIVATE);

SharedPreferences.Editor editor = preferences.edit();

editor.putString("TOKEN",token);

editor.apply();

토큰은 모든 세션에서 사용할 수 있으며, 문제가 없으며 자동 재기록은 주 전체에서 더 이상의 문제 없이 수행됩니다.

로그아웃 기능을 작성하는 동안 공유 기본 설정을 다음과 같이 지웠습니다.

SharedPreferences preferences = App.getContext().getSharedPreferences("UserCredentials", Context.MODE_PRIVATE);

SharedPreferences.Editor editor = preferences.edit();

editor.clear();

editor.apply()

간단히 말해서 다음과 같이 쓸 수 있습니다.

preferences.edit().clear().apply()

캐시를 지웠는지 확인하기 위해 로그아웃하기 전에 기록합니다.preferences.getString("TOKEN");로표된으로 됩니다.null.

기본 활동을 다시 시작한 후(로그인 조각으로 시작했기 때문에) - 다음을 사용하여 토큰을 다시 확인합니다.

SharedPreferences preferences = App.getContext().getSharedPreferences("UserCredentials", MODE_PRIVATE);
        
String retrievedToken = preferences.getString("TOKEN",null); // Second param = default value

Log.d(TAG, "RETRIEVING TOKEN: " + retrievedToken);

로그아웃하기 전에 토큰이 확실히 지워졌음에도 불구하고 실제로 토큰이 다시 나타났습니다.

(로그아웃 유발 -> 'login-using-token 루프)

에를 추가한 editor.commit();토큰 설정 및 삭제 모두에 대해 실제로 영구적으로 삭제됩니다.

참고하세요, 저는 에뮬레이터를 사용했습니다.

인메모리 스토리지는 업데이트되지만 앱이 다시 시작되기 전에는 비동기 호출이 이루어지지 않았기 때문에 이러한 동작은 실제로 의미가 있습니다.

그때에문.commit();이 강제로 대기(를 하고 명령과 실제 명령을 합니다.system.exit()에 면에반, 등.apply()다른 명령이 앱에서 특정 상태를 강제로 변경할 경우 오류가 발생할 수 있습니다.

올바른 위치를 모두 선택하려면 항상 apply()와 commit()를 모두 사용합니다.

언급URL : https://stackoverflow.com/questions/5960678/whats-the-difference-between-commit-and-apply-in-sharedpreferences

반응형