北京网站建设的公司,龙岩市建设局网站,广告设计与制作内容,郑州小型网站制作公司目录 架构设计的目的对 MVC 的理解Android 中 MVC 的问题试吃个小李子ViewModelController 大家好#xff01;
作为 Android 程序猿#xff0c;MVC 应该是我们第一个接触的架构吧#xff0c;从开始接触 Android 那一刻起#xff0c;我们就开始接触它#xff0c;可还记得我… 目录 架构设计的目的对 MVC 的理解Android 中 MVC 的问题试吃个小李子ViewModelController 大家好
作为 Android 程序猿MVC 应该是我们第一个接触的架构吧从开始接触 Android 那一刻起我们就开始接触它可还记得我们写的第一个 App 代码的样子
架构设计的目的 通过设计使程序模块化模块内 高内聚、模块间 低耦合提高开发效率便于复用及后续维护。 对 MVC 的理解 上图是 MVC 的架构图我们都知道MVC架构中 M 代表 Model模型、V 代表 View视图、C 代表 Controller控制器。它们的职责分别是 View 负责接收用户的输入事件然后将事件传递给 ControllerController 收到事件后会进行业务处理通知 Model 请求数据Model 拿到数据后返回给 Controller 进行后续处理或者通知 View 更新 UI。 Android 中 MVC 的问题
不幸的是在 Android 中通常由 Activity 充当 Controller与此同时由于 xml 的弱功能性导致 Activity 还需要负责视图的显示所以原本是负责初始化页面的 Activity就变成了 View 和 Controller 的载体导致这两部分内容耦合在 Activity 中。后果就是Activity 越来越臃肿、难以维护。这就违反了架构设计的初衷所以就有了后来的MVP。
试吃个小李子 点击按钮请求 wanandroid 网站的 banner 接口数据请求成功后更新到UI上显示接口数据 View 一个Button点击请求接口数据 一个TextView用于回显接口返回的数据 activity_main.xml
?xml version1.0 encodingutf-8?
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:gravitycenterandroid:orientationverticaltools:context.MainActivityButtonandroid:idid/btn_get_banner_infoandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:onClickgetBannerInfoandroid:textstring/get_banner_info /TextViewandroid:idid/tv_banner_infoandroid:layout_widthwrap_contentandroid:layout_heightwrap_content //LinearLayoutModel 请求接口 Repository.java
public final class Repository {private ApiService mService;private Repository() {createService();}public static Repository getInstance() {return SingletonHolder.sInstance;}private static final class SingletonHolder {private static final Repository sInstance new Repository();}/*** 请求 banner 数据*/public void getBanners(ResponseCallbackListBanner callback) {mService.getBanners().enqueue(new CallbackBaseResponseListBanner() {Overridepublic void onResponse(CallBaseResponseListBanner call, ResponseBaseResponseListBanner response) {BaseResponseListBanner body response.body();if (response.isSuccessful() body ! null) {if (body.getErrorCode() 0) {callback.onSuccess(body.getData());} else {callback.onFail(body.getErrorMsg());}} else {callback.onFail(response.message());}}Overridepublic void onFailure(CallBaseResponseListBanner call, Throwable throwable) {callback.onFail(throwable.getMessage());}});}private void createService() {Retrofit retrofit new Retrofit.Builder().baseUrl(HttpConstant.BASE_URL).addConverterFactory(GsonConverterFactory.create()).build();mService retrofit.create(ApiService.class);}
}Controller 获取数据 更新UI MainActivity.java
public class MainActivity extends AppCompatActivity implements ResponseCallbackListBanner {private TextView mBannerInfoTv;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mBannerInfoTv (TextView) findViewById(R.id.tv_banner_info);}/*** 按钮点击事件* param view*/public void getBannerInfo(View view) {getBanners();}/*** 获取 banner 数据*/private void getBanners() {Repository.getInstance().getBanners(this);}Overridepublic void onSuccess(ListBanner banners) {if (banners ! null banners.size() 0) {showBannerInfo(banners);}}Overridepublic void onFail(String msg) {Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT);}/*** 更新UI* param banners*/private void showBannerInfo(ListBanner banners) {StringBuilder sb new StringBuilder(wanandroid 官网\nhttps://www.wanandroid.com\n\n);for(Banner item : banners) {sb.append(item.getTitle()).append(\n);}mBannerInfoTv.setText(sb.toString());}
}附上源码链接
致谢 感谢 wanandroid 提供的开放API
参考 MVC、MVP、MVVM我到底该怎么选
写在最后 很荣幸成为一名 Android 程序猿虽然不是一名合格的猿。一路走来磕磕绊绊借此感谢帮助过我的人感谢指点、感恩遇见