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

一、项目框架

当前比较流行的框架的 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.csdn.net/dong_junshuai/article/details/90672820

五、本文Demo地址

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于Spring Boot的Android开发项目可以是一个使用Spring Boot框架搭建的后端服务,为Android客户端提供接口与数据的交互。以下是一个可能的开发项目的描述: 该项目的目标是开发一个匿名社交平台的Android客户端应用,并使用Spring Boot作为后端服务。 首先,我们将使用Spring Boot来构建一个可扩展的、高性能的后端服务。后端服务将提供用户认证、用户信息管理、文章发布、评论回复等功能的接口,并通过数据库存储数据。我们可以使用Spring Security实现用户认证和授权功能,使用Spring Data JPA实现对数据库的访问和操作。 接下来,我们将在Android客户端应用中集成与后端服务的交互。通过使用Retrofit等网络库,我们可以方便地与后端服务进行通信,发送HTTP请求并接收响应。例如,用户可以通过登录请求进行认证,在后端验证用户名和密码的正确性,并返回登录凭证。在认证成功后,用户可以使用凭证访问其他需要认证的接口,如发表文章、评论回复等。 在Android客户端应用中,我们可以使用MVP(Model-View-Presenter)或MVVM(Model-View-ViewModel)等架构模式进行开发,将业务逻辑与界面逻辑分离。我们可以使用RxJava来处理异步事件和数据流,通过LiveData来实现数据观察和通知。同时,我们可以使用Dagger2等依赖注入框架来管理组件间的依赖关系,提高代码的可测试性和可维护性。 总结而言,基于Spring Boot的Android开发项目是一个使用Spring Boot作为后端服务,为Android客户端提供接口与数据交互的项目。通过结合网络库、架构模式和依赖注入等技术,我们可以开发出高性能、可扩展、易维护的Android应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值