1. 程式人生 > >元件化中遇到的問題

元件化中遇到的問題

android元件化方案整理 之前整理過元件化的知識點以後,就開始弄公司的專案了。這裡把暫時遇到的幾個問題整理一下。

AAR的引入問題

情景: 把aar放到commentLibrary裡面,在其他project或者library中呼叫其中的方法,就避免了重複複製的問題。 在commentLibrary裡配置好以後,你所有引入這個library中都再需要配置一下:

在android節點內:
repositories {
        flatDir {
            dirs '../commonlibrary/libs'
        }
    }

元件化和MVP的碰撞

之前的MVP一直用的都是比較簡單的形式,V(Library中的fragment)和P的繫結是放到activity(project的Main)中,也就是fragment初始化的時候的。但是我們的元件化是肯定要解耦的,那麼activity中就不能有Lirbrary中類的引入。所以之前的MVP就需要改變一下。那麼fragment和BaseView中間就需要抽離出來一個BaseFragment,它既作為ARouter初始化的返回:

Fragment fragment = (Fragment) ARouter.getInstance().build(RouteUtils.CaptureScene_Fragment_Main).navigation();

也作為activity中初始化的使用:

BaseFragment tasksFragment =
                (BaseFragment) getSupportFragmentManager().findFragmentById(R.id.contentFrame);
        if (tasksFragment == null) {
            // Create the fragment
            tasksFragment = FragmentUtils.getCaptureSceneFragment();
            ActivityUtils.addFragmentToActivity(
                    getSupportFragmentManager(), tasksFragment, R.id.contentFrame);
        }

同時,把V和P層的繫結放到BaseFragment中:

public abstract class BaseFragment<V extends BaseView, P extends BaseMvpPresenter<V>> extends Fragment {
    private P presenter;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (presenter == null) {
            presenter = createPresenter();
        }

        if (presenter == null) {
            throw new NullPointerException("presenter 不能為空!");
        }
        //繫結view
        presenter.onAttachMvpView((V) this);
    }

    /**
     * 建立Presenter
     *
     * @return 子類自己需要的Presenter
     */
    protected abstract P createPresenter();

    public P getPresenter() {
        return presenter;
    }
}

這裡推薦一下高階MVP架構封裝演變全過程 我在去年的時候有參考他的基礎架構寫過OKHTTP的基於OKhttp的MVP封裝,他提供了多種進階方案,比較你能百度到的大多數MVP的文章,我認為他是寫的不錯的。