Android框架搭建(MVP + Dagger2 + Retrofit + RxJava + 自定义插件)

本文总结了当前流行的Android项目框架MVP + Retrofit + OkHttp + Dagger2 + butterknife。介绍了MVP框架,它由MVC演化而来,能使项目逻辑更清晰。还讲解了注入框架Dagger2可对MVP适度解耦,同时给出解决MVP建类过多问题的插件及Demo地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、项目框架

当前比较流行的框架的 MVP + Retrofit + OkHttp + Dagger2 + butterknife全家桶,今天略做总结。

  • MVP
  • Retrofit
  • OkHttp
  • Dagger2
  • RxJava
  • Glide
  • butterknife

二、MVP框架

MVP由原来的MVC演化而来,主要解决了以前MVC由于杂糅导致Activity、Fragment臃肿的问题,使得项目逻辑更加清楚。但使用的时候根据自己的需要,也不必需要过分拘谨于MVP的形式。
下面是我对MVP的理解,从而进行的Base类封装。

BaseView

public interface BaseView {
    /**
     * 显示加载框
     */
    void showLoading();

    /**
     * 隐藏加载框
     */
    void hideLoading();

    /**
     * Toast
     * @param toastStr
     */
    void showToast(String toastStr);

    /**
     * 跳转Activity
     * @param activity
     */
    void goPage(Class<? extends Activity> activity);

    /**
     * 跳转Activity
     * @param activity
     * @param bundle
     */
    void goPage(Class<? extends Activity> activity, Bundle bundle);

    /**
     * 跳转Activity
     * @param activity
     * @param bundle
     * @param requestCode
     */
    void goPage(Class<? extends Activity> activity, Bundle bundle, int requestCode);
}

BasePresenter

public interface BasePresenter<T extends BaseView> {
    /**
     * 绑定View
     * @param view
     */
    void attachView(T view);

    /**
     * 解除绑定
     */
    void detachView();
}

BasePAV (Presenter与View的关联类)

public class BasePAV<T extends BaseView> implements BasePresenter<T> {

    protected T mView;

    @Override
    public void attachView(T view) {
        mView = view;
    }

    @Override
    public void detachView() {
        if (mView != null) {
            mView = null;
        }
    }
}

BaseActivity

public abstract class BaseActivity<T extends BasePresenter> extends AppCompatActivity implements BaseView {

    @Inject
    @Nullable
    public T mPresenter;

    protected KProgressHUD mKProgressHUD;
    protected Unbinder unbinder;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayout());
        unbinder = ButterKnife.bind(this);
        initInject();
        if (mPresenter != null) {
            mPresenter.attachView(this);
        }
        initViewAndData();
    }

    protected ActivityComponent getActivityComponent() {
        return DaggerActivityComponent.builder()
                .appComponent(App.getAppComponent())
                .activityModule(new ActivityModule(this))
                .build();
    }

    protected abstract int getLayout();

    protected abstract void initInject();

    protected abstract void initViewAndData();

    @Override
    public void goPage(Class<? extends Activity> activity) {
        Intent intent = new Intent(this, activity);
        startActivity(intent);
    }

    @Override
    public void goPage(Class<? extends Activity> activity, Bundle bundle) {
        Intent intent = new Intent(this, activity);
        intent.putExtra("bundle", bundle);
        startActivity(intent);
    }

    @Override
    public void goPage(Class<? extends Activity> activity, Bundle bundle, int requestCode) {
        Intent intent = new Intent(this, activity);
        intent.putExtra("bundle", bundle);
        startActivityForResult(intent, requestCode);
    }

    @Override
    public void showLoading() {
        mKProgressHUD = KProgressHUD.create(this);
        mKProgressHUD.setStyle(KProgressHUD.Style.SPIN_INDETERMINATE)
                .setCancellable(true)
                .setAnimationSpeed(2)
                .setDimAmount(0.5f)
                .show();
    }

    @Override
    public void hideLoading() {
        if (mKProgressHUD != null) {
            mKProgressHUD.dismiss();
        }
    }

    @Override
    public void showToast(String toastStr) {
        MyToast.showToast(this, toastStr);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mPresenter != null) {
            mPresenter.detachView();
        }
        unbinder.unbind();
    }
}

BaseFragment

public abstract class BaseFragment<T extends BasePresenter> extends Fragment implements BaseView {

    @Inject
    @Nullable
    protected T mPresenter;

    protected Unbinder unbinder;
    protected View mRootView;
    protected KProgressHUD mKProgressHUD;

    protected abstract int getLayoutId();

    protected abstract void initInject();

    protected abstract void initEventAndData();

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        if (mRootView == null) {
            mRootView = inflater.inflate(getLayoutId(), container, false);
        }
        unbinder = ButterKnife.bind(this, mRootView);
        initInject();
        return mRootView;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        mPresenter.attachView(this);
        unbinder = ButterKnife.bind(this, view);
        initEventAndData();
    }

    protected FragmentComponent getFragmentComponent() {
        return DaggerFragmentComponent.builder()
                .appComponent(App.getAppComponent())
                .fragmentModule(new FragmentModule(this))
                .build();
    }

    @Override
    public void goPage(Class<? extends Activity> activity) {
        Intent intent = new Intent(getActivity(), activity);
        startActivity(intent);
    }

    @Override
    public void goPage(Class<? extends Activity> activity, Bundle bundle) {
        Intent intent = new Intent(getActivity(), activity);
        intent.putExtra("bundle", bundle);
        startActivity(intent);
    }

    @Override
    public void goPage(Class<? extends Activity> activity, Bundle bundle, int requestCode) {
        Intent intent = new Intent(getActivity(), activity);
        intent.putExtra("bundle", bundle);
        startActivityForResult(intent, requestCode);
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        unbinder.unbind();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mPresenter != null) {
            mPresenter.detachView();
        }
    }

    @Override
    public void showLoading() {
        mKProgressHUD = KProgressHUD.create(getActivity());
        mKProgressHUD.setStyle(KProgressHUD.Style.SPIN_INDETERMINATE)
                .setCancellable(true)
                .setAnimationSpeed(2)
                .setDimAmount(0.5f)
                .show();
    }

    @Override
    public void hideLoading() {
        if (mKProgressHUD != null) {
            mKProgressHUD.dismiss();
        }
    }

    @Override
    public void showToast(String toastStr) {
        MyToast.showToast(getActivity(), toastStr);
    }
}

三、注入框架Dagger2的使用

MVP模式分工明确,的虽然使得项目结构清晰,但是他的弊端也很明显----类比较多,从而导致耦合度比较高,使用Dagger2可以进行适度的解耦。注意主要有三项,具体的就不在这里说了。

  • scope
  • module
  • component

四、 解决MVP建很多类的问题

每次写一个Activity都需要手动建多个辅助类,这里可以使用我开发的一个插件,快速,完美的开发。
可以直接在插件库搜索,MVPPlug,或者你可以根据自己的项目开发适用自己项目的插件,参考地址:
https://blog.youkuaiyun.com/dong_junshuai/article/details/90672820

五、本文Demo地址

https://github.com/CnRiven/DaggerMvp
后续还会进行Demo的完善。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值