거꾸로 의존 - 감청 Activity, Fragment 의 생명주기

2966 단어
도입부
면접 을 볼 때마다 모델 을 디자인 할 줄 아 느 냐 는 질문 을 받 고 '큰소리 디자인 모델' 을 보 러 간다.'헤드 퍼스트 디자인 모델 등' 책 은 처음 보 니 신기 하 다. 몇 개 를 보고 나 니 실제 프로젝트 에 서 는 사용 할 수 없다 는 느낌 이 들 었 다. 과도 한 디자인, 비대 한 코드 등 문 제 를 일 으 킬 수 있다. 한 가지 만 간단하게 해결 할 수 있 는 일 인 데 여러 가지 유형 을 만들어 야 한다. 그래서 시간 이 지나 면 잊 어 버 렸 다. 면접 관 이 물 었 을 때 나 는 하나 도 대답 하지 못 하고 마음속 으로 면접 관 에 게 대답 했다.경멸 하 다.
왜 디자인 모델 을 배 워 요?
옛날 에 프로젝트 에 간단 한 다 중 플랫폼 공유 기능 이 있 었 습 니 다. 회사 업무 가 확대 되면 서 새로운 기능 이 계속 추가 되 었 습 니 다. 입구 의 동적 전환 공유 소스, 일부 업무 가 표시 되 는 지, 서버 에 알 리 는 지 등 입구 에 따라 보 여 주 는 페이지 도 일치 하지 않 았 기 때문에 모든 공유 업무 코드 는 서로 다른 페이지 에 분포 되 었 습 니 다. 매번 의 작은 수리 가 있 었 습 니 다.바 꾸 는 것 이 저 를 놀 라 게 했 습 니 다. 최근 에 제품 은 모든 공유 페이지 를 팝 업 형식 으로 바 꾸 라 고 요 구 했 습 니 다. 그리고 다른 기능 도 추가 해 야 한 다 는 것 을 깨 달 았 습 니 다. 마지막 으로 공 유 된 업무 논 리 를 따로 떼 어 내 고 디자인 모델 을 열심히 공부 하 게 되 었 습 니 다. 쉽게 말 하면 디자인 모델 은 프로 그래 밍 의 복잡 도 를 낮 추고 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); 
   }
}

좋은 웹페이지 즐겨찾기