거꾸로 의존 - 감청 Activity, Fragment 의 생명주기
면접 을 볼 때마다 모델 을 디자인 할 줄 아 느 냐 는 질문 을 받 고 '큰소리 디자인 모델' 을 보 러 간다.'헤드 퍼스트 디자인 모델 등' 책 은 처음 보 니 신기 하 다. 몇 개 를 보고 나 니 실제 프로젝트 에 서 는 사용 할 수 없다 는 느낌 이 들 었 다. 과도 한 디자인, 비대 한 코드 등 문 제 를 일 으 킬 수 있다. 한 가지 만 간단하게 해결 할 수 있 는 일 인 데 여러 가지 유형 을 만들어 야 한다. 그래서 시간 이 지나 면 잊 어 버 렸 다. 면접 관 이 물 었 을 때 나 는 하나 도 대답 하지 못 하고 마음속 으로 면접 관 에 게 대답 했다.경멸 하 다.
왜 디자인 모델 을 배 워 요?
옛날 에 프로젝트 에 간단 한 다 중 플랫폼 공유 기능 이 있 었 습 니 다. 회사 업무 가 확대 되면 서 새로운 기능 이 계속 추가 되 었 습 니 다. 입구 의 동적 전환 공유 소스, 일부 업무 가 표시 되 는 지, 서버 에 알 리 는 지 등 입구 에 따라 보 여 주 는 페이지 도 일치 하지 않 았 기 때문에 모든 공유 업무 코드 는 서로 다른 페이지 에 분포 되 었 습 니 다. 매번 의 작은 수리 가 있 었 습 니 다.바 꾸 는 것 이 저 를 놀 라 게 했 습 니 다. 최근 에 제품 은 모든 공유 페이지 를 팝 업 형식 으로 바 꾸 라 고 요 구 했 습 니 다. 그리고 다른 기능 도 추가 해 야 한 다 는 것 을 깨 달 았 습 니 다. 마지막 으로 공 유 된 업무 논 리 를 따로 떼 어 내 고 디자인 모델 을 열심히 공부 하 게 되 었 습 니 다. 쉽게 말 하면 디자인 모델 은 프로 그래 밍 의 복잡 도 를 낮 추고 bug 를 줄 이 며 유지 하기 쉽 습 니 다.
왜 Activity, fragment 수명 주 기 를 감청 합 니까?
어떤 학생 들 은 저 처럼 Dilog 가 닫 히 지 않 아서 생 긴 Window Leaked 나 옛날 버 전의 Volley 비동기 스 레 드 로 인 한 oom, RxJava 는 unRegister 가 없고 비동기 스 레 드 를 사용 하여 닫 히 지 않 았 습 니 다. handler 는 Runnable 을 제거 하지 않 았 습 니 다. 이런 문 제 는 Activity 나 fragment Destroy 에서 만 닫 으 면 됩 니 다. 그러나 반복 되 는 코드 를 쓸 때마다 추 하지 않 습 니까?가끔 잊 어 버 리 기도 합 니 다. 마침 안 드 로 이 드 소스 디자인 모델 을 다시 보고 이 책 을 해석 하고 디자인 모델 의 방법 으로 해결 해 보 세 요.
후진 원칙 에 의존 하 다.
(Dependence Inversion Principle) 프로그램 은 추상 적 인 인터페이스 에 의존 해 야 하 며 구체 적 인 실현 에 의존 해 서 는 안 된다. 쉽게 말 하면 추상 적 인 프로 그래 밍 을 요구 하고 실현 에 대해 프로 그래 밍 을 하지 말 아야 고객 과 실현 모듈 간 의 결합 을 낮 출 수 있다.
/** * Created by Administrator on 2016/7/27. */
public interface Destroyable {
void onDestroy();
}
import android.app.Dialog;import android.os.AsyncTask;
import java.util.ArrayList;import java.util.List;
/** * Created by Administrator on 2016/7/27. */
public class DestroyableManager {
private List destroyableList = new ArrayList<>();
private void add(Destroyable destroyable){
destroyableList.add(destroyable);
}
private void remove(Destroyable destroyable){
destroyableList.remove(destroyable);
}
public void noticeDestroy(){
for (Destroyable destroyable : destroyableList) {
if(destroyable instanceof Dialog){
((Dialog) destroyable).dismiss();
}else if (destroyable instanceof AsyncTask){
((AsyncTask) destroyable).cancel(true);
} //TODO close anything in here
destroyable.onDestroy();
} destroyableList.clear();
destroyableList = null;
}
}
public class BaseActivity extends Activity{
DestroyableManager destroyableManager = new DestroyableManager();
@Override
protected void onDestroy() {
super.onDestroy();
destroyableManager.noticeDestroy();
}
protected void addDestroyable(Destroyable destroyable){
destroyableManager.add(destroyable);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.