确保大家都了解,MVP是一种常用的Android应用程序架构模式,MVP可以帮助开发者将代码按照模块化的方式组织,并提供了一种分离视图层和逻辑层的方法。
在开发Android应用时,BaseFragment的使用可以帮助我们更好地管理Fragment的生命周期和提高我们代码的复用性。在本篇攻略中,我们将讲解如何使用MVP和BaseFragment将Android应用程序的开发过程继续拆分。
一、概述
1.1 什么是 MVP
模型 - 视图 - 展示器(MVP)是一种软件开发模式,它把程序分成三个部分: Model(数据模型)、View(用户界面)、Presenter(展示器)。
在MVP中,数据模型(Model)是纯Java对象,有具体的实现和接口。用户界面(View)是Activity、Fragment或视图部分。 展示器(Presenter)是连接模型(Model)和界面(View)的桥梁,在展示器中处理一些业务逻辑和界面逻辑。
1.2 BaseFragment 的优势
BaseFragment是一个通用模板类,它可以让代码和逻辑在各自的模块中进行处理,使得我们代码更容易维护和扩展。通过使用BaseFragment,我们可以很方便地重复使用代码和逻辑,它可以帮助我们避免代码重复,提高代码的可读性和可维护性。
二、实践
2.1 BaseFragment 的实现
public abstract class BaseFragment<V extends IMvpView, P extends IMvpPresenter<V>> extends Fragment implements IMvpView {
// 展示器
protected P mPresenter;
@SuppressWarnings("unchecked")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPresenter = createPresenter();
if (mPresenter != null) {
mPresenter.attachView((V) this);
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (mPresenter != null) {
mPresenter.detachView();
}
}
// 获取展示器实例
protected abstract P createPresenter();
}
在这里我们定义了一个抽象化的BaseFragment类,它实现了IMvpView中的方法,同时将Presenter类的引用交给了当前的Fragment,这样就可以充分利用Presenter来分离各个组件之间的业务逻辑。
2.2 MVP架构的具体实现
接下来我们来看如何实现一个简单的登陆界面,我们将会演示如何利用MVP将其分解。
2.2.1 LoginActivity
public class LoginActivity extends BaseFragment<ILoginView, LoginPresenter<ILoginView>> implements ILoginView {
private Button mBtnLogin;
@Override
protected LoginPresenter<ILoginView> createPresenter() {
return new LoginPresenter<ILoginView>();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_login, container, false);
mBtnLogin = (Button) view.findViewById(R.id.btn_login);
mBtnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mPresenter.login();
}
});
return view;
}
@Override
public void showLoginSuccess() {
Toast.makeText(getActivity(), "登录成功", Toast.LENGTH_SHORT).show();
}
@Override
public void showLoginFailed() {
Toast.makeText(getActivity(), "用户名或密码错误", Toast.LENGTH_SHORT).show();
}
}
在登陆界面的代码中,我们可以看到继续了BaseFragment,我们通过泛型继承了ILoginView,通过createPresenter()方法实例化Presenter对象,并在mBtnLogin的CLICK事件中调用LoginPresenter的login()方法。
2.2.2 LoginPresenter
public class LoginPresenter<V extends ILoginView> extends BaseMvpPresenter<V> {
public void login() {
getView().showLoginSuccess();
}
}
在Presenter中,我们从BaseMvpPresenter中继承了getView()的实现,并在login()方法中调用对应的View接口来显示登录成功信息。
2.3 另一个示例
除了登录界面外,我们也可以应用MVP架构进行RecyclerView的封装。
2.3.1 RecyclerViewActivity
public class RecyclerViewActivity extends BaseFragment<IRecyclerViewView, RecyclerViewPresenter<IRecyclerViewView>> implements IRecyclerViewView {
private RecyclerView mRvList;
private RecyclerViewAdapter mAdapter;
private List<String> mDataList;
@Override
protected RecyclerViewPresenter<IRecyclerViewView> createPresenter() {
return new RecyclerViewPresenter<>();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_recycler_view, container, false);
mRvList = (RecyclerView) view.findViewById(R.id.rv_list);
mDataList = new ArrayList<>();
mAdapter = new RecyclerViewAdapter(mDataList);
mRvList.setLayoutManager(new LinearLayoutManager(getActivity()));
mRvList.setAdapter(mAdapter);
mPresenter.loadData();
return view;
}
@Override
public void onDataLoaded(List<String> dataList) {
mDataList.clear();
mDataList.addAll(dataList);
mAdapter.notifyDataSetChanged();
Toast.makeText(getActivity(), "数据加载完成", Toast.LENGTH_SHORT).show();
}
}
在RecyclerViewActivity中,我们先在Activity中初始化了RecyclerView,并在onDataLoaded()方法中,使用mAdapter.notifyDataSetChanged()来更新RecyclerView的界面。
2.3.2 RecyclerViewPresenter
public class RecyclerViewPresenter<V extends IRecyclerViewView> extends BaseMvpPresenter<V> {
public void loadData() {
List<String> dataList = new ArrayList<>();
for (int i = 0; i < 20; i++) {
dataList.add("第" + (i + 1) + "条数据");
}
getView().onDataLoaded(dataList);
}
}
在Presenter中,我们仍然继承了BaseMvpPresenter,同时也定义了loadData()方法来获取数据列表,然后在获取成功后,通过对应的View方法显示数据。
三、总结
通过这篇文章,我们了解了MVP和BaseFragment的运用方法,并在实际应用中进行了尝试。使用这些对象可以更好地让我们的代码和逻辑分离,增强了程序的可读性和可维护性。如果你还没有开始使用这种设计方法,那么从今天起就可以开始尝试。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android MVP BaseFragment 通用式封装的实现 - Python技术站