Google 官方Android MVP架构实践 admin 2023-01-31 12:18:01 篇首语:本文由小编为大家整理,主要介绍了Google 官方Android MVP架构实践相关的知识,希望对你有一定的参考价值。 一、Google 官方MVP介绍 近期,关于android开发架构的讨论沸沸扬扬,各大技术平台随处可见关于Android架构的技术文章。MVC、MVP、MVVM等等,就目前的形式来看,MVP模式在Android开发领域界逐渐流行了起来。前段时间,Google也忍耐不住Android MVP架构的火热程度,给广大Android程序员带来了福利,推出了Google官方MVP架构例子。源码见: https://github.com/googlesamples/android-architecture 官方给出了四种MVP架构模式: 1、todo-mvp:MVP基础架构 2、todo-mvp-loaders:基于MVP基础架构,获取数据部分使用了Loaders架构 ns.jsZhuOer.COm3、todo-mvp-databinding:基于MVP基础架构,使用了数据绑定组件 4、todo-mvp-clean:基于MVP基础架构,引入Clean架构概念 官方正在进行的MVP架构模式: 1、todo-mvp-contentproviders:基于MVP基础架构,使用了Content Provider 2、todo-mvp-dragger:基于MVP基础架构,使用dragger2依赖注入 3、todo-mvp-rxjava:基于MVP基础架构,使用RxJava解决数据并发 二、MVP架构模式介绍 MVP中的M代表Model,即数据层,V代表View,即界面层,P代表Presenter,负责关联Model和View,把Model层的数据显示到View。 三、MVP架构实践 ns.jsZhuOer.COm这里,我从todo-mvp基础架构入手,模仿一下官方MVP源码,跟大家详细介绍一下Google官方MVP架构模式。官方的MVP示例源码展示的是一个简易便签,数据提供者是Sqlite数据库。我的项目里面数据提供者是网络,使用okhttp网络请求框架从服务器获取数据。一起来看看神奇的MVP架构模式是怎样把数据显示到手机界面的吧。 google官方todo-mvp模式架构图(结合todo-mvp源码可以好好感受一下mvp的魅力) Presente基础接口 public interface BasePresenter void start(); View基础接口 public interface BaseView void setPresenter(T presenter); ns.jsZhuOer.COm 具体任务的Presener和View接口,Presenter接口里面封装的是数据获取的方法,需要数据提供者具体实现;View里面封装的方法是界面层(Fragment/Activity)要实现的方法。 public interface GankContract interface Presenter extends BasePresenter void loadGank(int pageIndex, int pageSize); interface View extends BaseView void showProgress(); void hideProgress(); void showGank(List gankList); 数据提供者,基于Okhttp请求,我这里使用的鸿洋大神封装好的Okhttp请求库。提供一个接口,将数据共享出去,提供给具体Presenter。 Okhttp封装具体使用方法见:http://blog.csdn.net/lmj623565791/article/details/47911083 数据提供的服务器是我自己搭建的一个阿里云服务器,为了平时开发方便,写了一个数据接口,可以获取大量的美女图片和文字信息,get和post请求都支持,便于开发时候做数据测试。数据接口地址: http://gank.io/api/data/%E7%A6%8F%E5%88%A9/10/3 感谢干货提供。 public class ServerHelper private DataLoadListener listener; public void getGankList(int pageSize, int pageIndex) String url = "http://gank.io/api/data/%E7%A6%8F%E5%88%A9/" + pageSize + "/" + pageIndex; Log.i("test", url); OkHttpUtils.get().url(url).build().execute(new GankResponseCallBack() @Override public void onError(Call call, Exception e) listener.failure(e); Log.i("test", "errorerror"); @Override public void onResponse(List response) Log.i("test", "数据获取成功 " + new Gson().toJson(response, List.class)); listener.success(response); ); public interface DataLoadListener void failure(Exception e); void success(List gankList); public void setListener(DataLoadListener listener) this.listener = listener; 具体Presenter,实现了GankContract.Presenter和ServerHelper.DataLoadListener接口,关联了GankContract.View接口,把网络请求到的数据提供给View。 public class GankPresenter implements GankContract.Presenter,ServerHelper.DataLoadListener private GankContract.View view; private ServerHelper serverHelper; //数据提供者 这里应该封装网络数据请求 public GankPresenter(GankContract.View view) this.view = view; view.setPresenter(this); serverHelper = new ServerHelper(); serverHelper.setListener(this); @Override public void start() @Override public void failure(Exception e) view.hideProgress(); @Override public void success(List gankList) view.hideProgress(); view.showGank(gankList); @Override public void loadGank(int pageIndex, int pageSize) serverHelper.getGankList(pageIndex, pageSize); 具体的View,这里的BeautyFragment实现了GankContract.View,使用GankContract.Presenter进行数据请求,View如果接受到数据,则对数据进行界面展示操作。这样保证了界面层只负责数据的显示,减少了界面层的数据逻辑处理,使得界面更加流畅。 public class GankFragment extends Fragment implements GankContract.View, SwipeRefreshLayout.OnRefreshListener private GankContract.Presenter presenter; private SwipeRefreshLayout refreshLayout; private RecyclerView recyclerView; private GankAdapter adapter; private List gankList; private int pageIndex = 1; private int pageSize = 10; private boolean isLastPage = false; private int lastVisibleItem = 0; private LinearLayoutManager linearLayoutManager; public static GankFragment newInstance() return new GankFragment(); @Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); gankList = new ArrayList<>(); @Override public void onActivityCreated(Bundle savedInstanceState) super.onActivityCreated(savedInstanceState); @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) View view = inflater.inflate(R.layout.fragment_beauty,container,false); recyclerView = (RecyclerView) view.findViewById(R.id.tabRecyler); refreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.tabSwipeRefresh); linearLayoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL,false); //设置下拉刷新 refreshLayout.setColorSchemeColors(R.color.colorAccent); refreshLayout.setOnRefreshListener(this); //第一次进入界面时候加载进度条 refreshLayout.setProgressViewOffset(false, 0, (int) TypedValue .applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, getResources() .getDisplayMetrics())); recyclerView.setLayoutManager(linearLayoutManager); adapter = new GankAdapter(gankList,getActivity()); recyclerView.setAdapter(adapter); Log.i("test", "11111"); presenter.loadGank(pageSize,pageIndex); recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) super.onScrolled(recyclerView, dx, dy); lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition(); @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == adapter.getItemCount()) Log.i("pageIndex",pageIndex+""); //根据类目网络请求数据 Log.e("test", "最后一页" + isLastPage); if(!isLastPage) presenter.loadGank(pageSize,pageIndex); ); return view; @Override public void showProgress() refreshLayout.setRefreshing(true); @Override public void hideProgress() refreshLayout.setRefreshing(false); @Override public void showGank(List list) if (list != null) if (pageIndex == 1) gankList.clear(); gankList.addAll(list); isLastPage = false; pageIndex++; else if (list.size() == pageSize) gankList.addAll(list); isLastPage = false; pageIndex++; else gankList.addAll(list); isLastPage = true; adapter.notifyDataSetChanged(); @Override public void setPresenter(GankContract.Presenter presenter) this.presenter = presenter; @Override public void onRefresh() pageIndex = 1; presenter.loadGank(pageSize,pageIndex); public class GankActivity extends AppCompatActivity @Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_beauty); GankFragment fragment = GankFragment.newInstance(); ActivityUtils.addFragmentToActivity(getSupportFragmentManager(),fragment,R.id.container); //设置presenter new GankPresenter(fragment); ns.jsZhuOer.COm 好了,Google 官方MVP架构实践介绍完毕,希望对大家有收获。上述代码是实现MVP架构模式的关键代码,中间还涉及到的ActivityUtils等类都在源码中哦,欢迎大家下载。 源码下载地址:https://github.com/xiaomanzijia/mvp ns.jsZhuOer.COm以上是关于Google 官方Android MVP架构实践的主要内容,如果未能解决你的问题,请参考以下文章 回声消除-理论篇 curl使用 您可能还会对下面的文章感兴趣: 相关文章 商丘私人空放联系方式_基本资料审核后快速就能放款平台 济宁私人借钱24小时在线,5万以上级别的贷款|无抵押个人借贷|秒下| 湖州空放私借2小时放款—身无分文借贷100%直接放款 宜昌纯私人放款微信电话——马上为您安排信贷服务+当日到账 蚌埠24小时私人放款联系方式随借随到-做生意借贷|应急周转|大额优先| 遵义空放借钱贷款联系电话:走投无路申请放款马上就到账 绵阳专业空放贷款私人联系方式,不看过往|先贷后放|马上拿钱| 德州附近个人放款电话号码多少:不审核+随借随还+当日成功+直接到账