2017-05-11 6 views
0

Mosby 3.0.3으로 이전했으며 현재는 PresenterManager의 능력을 조사했습니다. Activity, Fragment 및 ViewGroup과 관련하여 발표자의 평생을 명확하게 밝히지는 못했습니다. ViewGroupMvpDelegateImpl, FragmentMvpDelegateImplActivityMvpDelegateImpl을 살펴본 결과 발표자가 종료 될 때 100 % 확신 할 수 없었습니다.Mosby 3의 발표자 평생 MVP

는 지금까지 내가 기본 keepPresenterInstancekeepPresenterOnBackstack에 의해 이해 항상 true이며 우리는 이러한 상황을 : 그것은 조각이 가기 backstack 또는 전체 프로세스가 종료에서 제거 될 때까지

  1. 조각의 발표자가 존재한다. 이 경우에는 내가 FragmentMvpDelegateImpl에서 방법에 의존 :

    protected boolean retainPresenterInstance() { 
    
        Activity activity = getActivity(); 
        if (activity.isChangingConfigurations()) { 
        return keepPresenterInstanceDuringScreenOrientationChanges; 
        } 
    
        if (activity.isFinishing()) { 
        return false; 
        } 
    
        if (keepPresenterOnBackstack && BackstackAccessor.isFragmentOnBackStack(fragment)) { 
        return true; 
        } 
    
        return !fragment.isRemoving(); 
    } 
    

그러나 childFragmentManagers 또는 (또 다른 조각 내부) FragmentPagerAdapter에서 조각에 대한 조각은 어떻습니까?

  1. 활동 및 ViewGroup의 발표자는 활동이 완료되지 않았거나 전체 프로세스가 종료 될 때까지 존재합니다. 이 경우에는 내가 ActivityMvpDelegateImpl에서 방법에 의존 :

    static boolean retainPresenterInstance(boolean keepPresenterInstance, Activity activity) 
    { 
        return keepPresenterInstance && (activity.isChangingConfigurations() 
         || !activity.isFinishing()); 
        } 
    

모든 ViewGroups이 사실인가, 그들이 거주하는 곳?

그런 질문을하는 이유는 우리 앱에서는 조각, 사용자 정의 뷰 그룹의 액티비티, 프래그먼트, 프래그먼트가 있고 모두 프리젠 테이션을 가지고 있기 때문입니다. 아이디어는 발표자의 거대한 자원을 detachView(final boolean retainInstance)에 공개하지만 메모리에있는 가벼운 - inMemory 캐시와 같은 메모리를 유지하여보기가 백 스택에서 복원 될 때 다시 사용하는 것입니다.

마찬가지로 Dagger2를 사용하며 적절한 하위 구성 요소를 출시해야하는 시점을 이해하는 것이 중요합니다.

답변

0
  • 활동 : 작업이 완료 될때 발표자가 파괴됩니다 (프리젠 테이션 관리자에서 제거하기 때문에 쓰레기 수집 할 수 있습니다) (또는 활동 프로세스 죽음에). 따라서 화면 방향이 변경되는 동안 액티비티를 유지하고 백 스택에도 액티비티를 유지합니다 (백 스택에 여러 액티비티가있는 경우). 당신이 Fragment.setRetainInstanceState(true)을 설정하면 모스 2.x에서 발표자에 단지 화면 방향 변경에 걸쳐 유지했다 : 모스 2.x를

  • 조각이 같이 꽤 동일하게 작동합니다. Mosby 3.x에서는 PresenterManager를 사용하여 방향 변경을 가로 질러 발표자를 유지하기 때문에 Mosby 3.x에서는 더 이상 필요하지 않습니다. 또한 조각이 백 스택에있는 경우 Mosby 3.x Presenter가 유지됩니다. 즉, 프래그먼트가 백 스택에있어 뷰가 없어도 UI 위젯이 삭제 (Fragment.onDestroyView()가 호출 됨)되어 Presenter 인스턴스가 유지되고 사용자가 Fragment 백 스택을 팝하면 당신은 발표자가 다시 와서 재사용됩니다. 그러나 Fragment가 백 스택에있는 동안 View는 Presenter에서 분리되고 Presenter.detachView (true)가 호출되며 Fragment가 조각 백 스택의 맨 위에있는 경우 다시 연결됩니다. 이것은 기본 동작이며 모든 종류의 Fragment incl에 대해 작동합니다. ViewPager 및 중첩 된 ChildFragments (자식) 백 스택.이 값을 FragmentMvpDelegateImpl(keepPresenterInstance, keepPresenterOnBackstack)의 생성자 매개 변수로 구성하여 화면 방향을 변경하는 동안 발표자를 유지하지 않거나 백 스택에서 조각이있는 동안 발표자를 유지하지 않을 수 있습니다.

  • ViewGroups : mosby 2.x에서는 화면 방향이 전혀 변경되지 않아 생존하지 못했습니다. Mosby 3.x에서는 PresenterManager를 사용하므로 수행합니다. 그러나 각 ViewGroup에 id (@id/something)를 부여해야합니다. 그렇지 않으면 Android 프레임 워크가보기 (세로보기에서 가로보기)를 매핑하는 방법을 모릅니다. 이미 올바르게 관찰 했으므로 "호스트 활동"이 종료되거나 ViewGroup이 부모 ViewGroup에서 프로그래밍 방식으로 제거 될 때까지 (예 : parentViewGroup.removeChild(indexOfViewGroup)) ViewGroups는 유지됩니다. 그것이 어디에 있는지 상관하지 않습니다. Fragment에 ViewGroup을 넣으면 제대로 작동하지 않을 수도 있습니다. 나는 아직 그 엣지 경우를 생각/테스트하지 않았다. 그러나 "Fragment of Parent"가 다시 스택에 놓이게되고 (새로운 Fragment를 누를 때) "Fragment of Fragment" (예 : FragmentManager가 내부적으로 호출하는 경우)와 비슷하게 ViewGroup을 포함하는 ViewGroup이 제거 될 것이므로 ViewGroup의 표현자가 파기되지만 그렇지 않아야합니다 (Fragment 사용자가 조각을 백 스택으로 가져올 수 있기 때문에). 이 경우 ViewGroup이 새 Presenter 인스턴스를 만드는 경우 일 수 있습니다. 이미 말했듯이 아직이 엣지 케이스를 테스트하거나 생각하지는 못했지만, Fragment가 ViewGroup에 알려지지 않았기 때문에 ("아는 한") "호스팅 프래그먼트"에 대한 참조를 얻는 방법은 없습니다. Mosby Fragments 나 Mosby ViewGroups를 사용하되 Mosby ViewGroup을 Fragment에 사용하지 말 것을 권한다.

해당 대리자 생성자에 부울 플래그를 설정하여 모든 동작을 구성 할 수 있습니다.

예상대로 작동하는지 확인하는 가장 쉬운 방법은 createPresenter() 메소드와 persenter.detachView() 메소드에 로그를 추가하는 것입니다. 또한 Mosby는 디버깅을위한 일부 로깅을 제공합니다. 각 대리자에서 사용할 수 있습니다 (예 : FragmentMvpDelegateImpl.DEBUG = true (예 : Application.onCreate()). 각 대표 (Activity, Fragment, ViewGroup 및 각 Mvp, Mvp + ViewState, Mvi)에 대해이 작업을 수행해야합니다. 원할 경우 PresenterManager에 대한 로깅을 동일한 방법으로 활성화 할 수도 있습니다.

+0

종합적인 답변을 주셔서 감사합니다. Mosby 문서에서 이러한 주석을 보는 것이 편리 할 것입니다. –