Jetpack 시리즈 - Lifecycle 엔트리에서 소스로
Lifecycle 소개
Lifecycle은 Google이 내놓은 JetPack 프레임워크 구성 요소 중 하나입니다.Activity와 Fragment의 생명 주기를 감지하는 데 사용되며, 더욱 간결하고 일반적인 코드를 작성할 수 있습니다.
Lifecycle 사용
총 두 걸음
public class MyLifeObserver implements LifecycleObserver {
private static final String TAG = "MyLifeObserver";
// OnLifecycleEvent() Lifecycle.Event.XXX , 。
// , onResumeListener()。
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResumeListener() {
Log.d(TAG, "onResume: ");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPauseListener() {
Log.d(TAG, "onPause: ");
}
@OnLifecycleEvent(Event.ON_DESTROY)
public void onDestoryListener() {
Log.d(TAG, "onDestory: ");
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getLifecycle().addObserver(new MyLifeObserver());
}
}
네가 믿든 안 믿든 코드는 이미 다 썼어!
코드를 살펴보겠습니다.
2019-02-28 12:00:40.068 com.example.lifecycledemo D/MyLifeObserver: onResume:
2019-02-28 12:00:46.091 com.example.lifecycledemo D/MyLifeObserver: onPause:
2019-02-28 12:00:46.416 com.example.lifecycledemo D/MyLifeObserver: onDestory:
Log은 Observer에서 작성한 방법이 Activity가 지정한 주기 내에 실행되었음을 보여 줍니다.축하드립니다.Lifecycle을 사용할 수 있습니다!하지만 몇 가지를 주의해야 한다.
1. LifecycleOwner , getLifecycle 。
2. 。
구체적인 코드는 다음과 같습니다.
public class MyActivity extends Activity implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
// Lifecycle
mLifecycleRegistry = *new*LifecycleRegistry(this);
//
mLifecycleRegistry.markState(Lifecycle.State.CREATED);
//
getLifecycle().addObserver(new MyLifeObserver());
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
@Override
public void onStart() {
super.onStart();
//
mLifecycleRegistry.markState(Lifecycle.State.STARTED);
}
@Override
protected void onResume() {
super.onResume();
//
mLifecycleRegistry.markState(Lifecycle.State.RESUMED);
}
@Override
protected void onDestroy() {
super.onDestroy();
//
mLifecycleRegistry.markState(Lifecycle.State.DESTROYED);
}
}
이로써 Lifecycle의 사용법은 이미 소개가 끝났습니다. AppCompatActivity가 Lifecycle Owner 인터페이스를 실현해 주었기 때문에 학생들은 생동감 있게 활용하도록 주의하겠습니다.예를 들어 네트워크 요청 도구를 봉인할 때 현재 Activity 대상을 전송하고 Activity 대상의 생명주기가 Destory일 때 요청 네트워크의 작업을 취소합니다.라이프스케일의 용무는 아직 많이 남았습니다. 여기서 가장 기초적인 것만 소개합니다. 라이프스케일을 통해 프로젝트를 최적화하는 방법을 생각해 보십시오.Lifecyle의 작업 원리에 관심이 있다면 계속 읽어 주십시오. 나는 당신을 데리고 원본에서 한 걸음 한 걸음 Lifecycle의 작업 원리를 완전히 이해할 것입니다.흥미가 없으면, 바로 문장 끝까지 끌어당겨 총결을 볼 수 있다.
Lifecycle의 작동 방식
우리는 사용된 몇 가지 종류를 입구로 삼아 라이프스케일의 작업 원리를 분석한다.우리는 주로 이 몇 가지 종류를 살펴보았다. (Crtl + 클래스 이름 클릭): Lifecycle Owner.java,Lifecycle.java,LifecycleRegistry.java.
LifecycleOwner.java
이것은 간단합니다. Lifecycle Owner는 getLifecycle () 방법을 정의했습니다. @NonNull을 통해 Lifecycle 대상을 되돌려줍니다.코드는 다음과 같습니다.
public interface LifecycleOwner {
@NonNull
Lifecycle getLifecycle();
}
Lifecycle.java
코드는 다음과 같습니다.
public abstract class Lifecycle {
@MainThread
public abstract void addObserver(@NonNull LifecycleObserver observer);
@MainThread
public abstract void removeObserver(@NonNull LifecycleObserver observer);
@MainThread
@NonNull
public abstract State getCurrentState();
@SuppressWarnings("WeakerAccess")
public enum Event {
ON_CREATE,ON_START,ON_RESUME,ON_PAUSE,ON_STOP,
ON_DESTROY,ON_ANY
}
@SuppressWarnings("WeakerAccess")
public enum State {
DESTROYED,INITIALIZED,CREATED,STARTED, RESUMED;
public boolean isAtLeast(@NonNull State state) {
return compareTo(state) >= 0;
}
}
}
Lifecycle의 코드도 많지 않으니 추상적인 클래스임을 주의하십시오.Lifecycle 내부는 두 개의 열거를 통해 구성 요소의 생명 주기 상태와 이벤트를 각각 정의합니다.다음 그림은 Android 개발자 홈페이지에서 발췌한 것으로, State와 Event의 관계에 대해 설명합니다.
간단하게 말하자면 이 그림은 어떻게 보는가: 화살표를 봐라, 예를 들면 ONCREATE 화살표: State가 INITIALIZED에서 CREATED로 변경되면 ONCREATE의 이벤트입니다.순서대로 유추하다.
LifecycleRegistry.java
이 클래스의 코드는 비교적 많은데 라이프스케일의 하위 클래스이자 감청 구성 요소 성명 주기의 핵심 클래스이다.우리는 사용한 방법들을 하나하나 살펴보았다.
A. 구조 방법은 주로 mLifecycle Owner와 현재 구성 요소의 상태(mState)를 초기화시켰기 때문에 할 말이 없다.
publicLifecycleRegistry(@NonNull LifecycleOwner provider) {
mLifecycleOwner = new WeakReference<>(provider);
mState = INITIALIZED;
}
B. Lifecycle의 사용 부분에서 Lifecycle Owner를 계승했고 구성 요소의 생명 주기 내에markState() 방법을 호출했습니다.다음과 같이 클릭합니다.
public void markState(@NonNull State state) {
moveToState(state);
}
C. 복잡한 논리 코드를 생략하고 이 핵심 방법인 sync()를 찾았습니다.
private void moveToState(State next) {
...
mHandlingEvent = true;
sync();
mHandlingEvent = false;
}
D. 같은sync() 방법에서 논리 코드를 무시하고 실제 실행하는 두 가지 방법을 발견했습니다:backwardPass(), forwardPass()
private void sync() {
LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
while(!isSynced()) {
mNewEventOccurred = false;
if(mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
backwardPass(lifecycleOwner);
}
Entry newest = mObserverMap.newest();
if(!mNewEventOccurred && newest != null && mState.compareTo(newest.getValue().mState) > 0) {
forwardPass(lifecycleOwner);
}
}
mNewEventOccurred = false;
}
E. backwardPass () 와 forwardPass () 에서 observer가 호출되었습니다.dispatchEvent (), 이름을 보면 이벤트를 보내는 방법이 틀림없습니다.
private void forwardPass(LifecycleOwner lifecycleOwner) {
...
observer.dispatchEvent(lifecycleOwner, upEvent(observer.mState));
...
}
private void backwardPass(LifecycleOwner lifecycleOwner) {
...
observer.dispatchEvent(lifecycleOwner, event);
popParentState();
...
}
F. dispatch Event () 방법을 누르면 다음 정적 내부 클래스에 들어갑니다. 이 클래스에서 Observer (아래 코드의 mLifecycle Observer) 가 생명 주기를 감청하는 방법이 여기에서 터치됩니다.그러나 이 방법의 mLifecycle Observer가 바로 우리가 실현한 Observer라는 것을 어떻게 확신합니까?이 정적 클래스에는 또 다른 방법이 있습니다. 어디에서 호출되었는지 클릭하십시오.
static class ObserverWithState {
State mState;
GenericLifecycleObserver mLifecycleObserver;
ObserverWithState(LifecycleObserver observer, State initialState) {
mLifecycleObserver = Lifecycling.getCallback(observer);
mState = initialState;
}
void dispatchEvent(LifecycleOwner owner, Event event) {
State newState = getStateAfter(event);
mState = min(mState, newState);
mLifecycleObserver.onStateChanged(owner, event);
mState = newState;
}
}
G. 반갑습니다.addObserver () 방법에 왔습니다.Lifecycle의 사용 부분에 대해 설명하는 것은,Observer를 연결하는 것이 바로 이 방법을 사용하는 것임을 기억하고 있을 것입니다.
@Override
public void addObserver(@NonNull LifecycleObserver observer) {
State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
ObserverWithState*statefulObserver = new ObserverWithState(observer, initialState);
ObserverWithState*previous = mObserverMap.putIfAbsent(observer, statefulObserver);
...
}
H. 마지막으로 Lifecycle Observer 인터페이스(관찰자)를 보니 비어 있었다.사실 우리는 주석을 보면 시스템이 apt-processor(주석 프로세서)를 통해 우리의 Observer를Lifecycle에 진정으로 필요한 유형의 Observer로 변환하는 것을 알 수 있다. 다음은 OnLifecycle Event 주석의 성명이다.
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OnLifecycleEvent {
Lifecycle.Event value();
}
총결산
보시다시피 Lifecycle의 작업 원리에 대한 이해가 많지 않으실 거라고 믿습니다. 인터페이스 리셋과 유사합니다. 우리는 Obersver의 대상을 만들고 Obersver의 인용을 Lifecycle에 건네주고 구성 요소의 생명주기 방법이 실행될 때 Observer의 상응하는 방법을 호출합니다.
물론 우리 스스로도 인터페이스 리셋을 써서 구성 요소의 생명 주기를 감시할 수 있지만, 우리는 어디에 감청기를 설치하고 생명 주기의 문제를 고려해야 한다.
사실 우리가 Lifecycle을 사용하는 진정한 이유는 Lifecycle(Lifecycle Registry)류가 숙주 구성 요소의 생명주기와 관련된 문제를 대량으로 처리하여 우리의 코드를 더욱 간결하게 하는 것이다.업무 논리에 전념하면 된다.
END
저는 레이가입니다. 제 글을 좋아하신다면 칭찬을 남겨주세요.질문과 건의가 있으면 댓글로 저의 Github을 남겨주세요. 팔로우 환영합니다~
Jetpack 칼럼:Lifecycle:Jetpack 시리즈 - Lifecycle 입문에서 원본 ViewModel:Jetpack 시리즈 - ViewModel 입문에서 원본 LiveData:Jetpack 시리즈 - LiveData 입문에서 원본 Palette:Jetpack 시리즈 - Palette 입문 안내서
--------------------------------------- The End
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.