zhanglin

不忘初心,方能始终!

MVP架构在xamarin android中的简单使用

好几个月没写文章了,使用xamarin android也快接近两年,还有一个月职业生涯就到两个年了,从刚出来啥也不会了,到现在回头看这个项目,真jb操蛋(真辛苦了实施的人了,无数次吐槽怎么这么丑),怪自己太年轻了,还好是给指定行业的人使用。 重新学习思考之后,再看自己在项目中的某些实现的代码,的确不尽人意,甚至想骂自己。

项目经常改,改来该去,代码一直增加,一个fragment也没什么功能,接近1000行的代码,用region括起来,开看起来还挺整齐的,找的时候就凉了。究其原因,没有一种模式,所有的逻辑全写在controller(fragment和activity里面),当然不管了解不了解什么框架模式、设计模式。最主要、最基本的还是实现功能和良好的用户体验,一些小的项目,不需要频繁修改需求甚至不需要MVP、MVC等模式来设计,那样反而有点刻意设计,代码复杂臃肿。关于android中mvp架构的介绍文章非常丰富,这里我只是做一个学习的记录,温故而知新。

程序的思想都是通用的,搞.net对于mvc框架应该是非常熟悉,webform用的目前应该不是很多。先说说android中 MVC,mvc分为三部分 :视图(View用户界面)、Controller(fragmnet、activity控制器业务逻辑)、Model(数据存取);
这里写图片描述
Model:负责数据的处理、请求网络数据、读取本地数据、检验等
View:UI操作,控件的实际处理,更新Model层的数据,负责用户请求通知Controller
Controller:Activity和Fragment,初始化各种控件,加载数据、逻辑的处理,职责比较多。

什么是MVP

mvp将controller改成了peresenter提出者,也改变了通信的方向,是一个MVC的改良版,MVP的结构如下:
这里写图片描述
Model:存取数据,网络数据、SharedPreferences、sqlite等数据的存取
Presenter:订阅,负责View和Model的交互,隔断View层和Model层的交互。调用View中的相应方法展示数据
View:Fragment、Activity、ViewGroup 这一层,处理用户的交互和事件,并触发Presenter中的相应操作
mvp的优点是:
1.view与model不发生任何交互,view层不能持有Model层的引用,不能直接去更新Model层,必须通过Presenter层,Presenter层中也不能直接操作View及相关的UI控件,必须通过View层的引用来操作。
2.便于测试,维护性提高,代码结构更加清晰,可以明显看到Activity和
3.View与Model分离使工程的整体架构和代码结构非常清晰(不再是所有的业务和逻辑都糅合在Activity、Fragment里了),易于理解和上手。
mvp的缺点是:
代码更加复杂,代码量增加。
实践是检验真理的唯一标准,下面通过一个简单的例子获取天气预报信息看看,如何在xamarin android项目如何使用MVP架构吧

使用mvp架构实现查询公网备案的例子

天气预报的接口:https://www.sojson.com/api/gongan/域名,根据域名查询备案信息
返回的格式是json.
如果你想更深入地了解mvp架构,可以参看一下google官方MVP框架源码解析之TODO-MVP
https://github.com/googlesamples/android-architecture/tree/todo-mvp/
效果图如下:
xamarin android presenter例子
项目的结构如下:
这里写图片描述
新建peresenter文件夹,GongAnPresenter.cs 如下:

    public class GongAnPresenter
    {
        private IGongAnView view;
        public GongAnPresenter(IGongAnView view)
        {
            this.view = view;
        }
        public async void showResult(string sitedomain)
        {
            var result = await SearchGongAn.getGonganDetail(sitedomain);
            if (result != null && result.status == 200)
                view.getServiceGongAnSuccess(result.data);
            else if (result == null)
            {
                view.getServiceGonganFail("请求失败");
            }
            else
            {
                view.getServiceGonganFail("没有备案:status:"+result.status);
            }
        }
    }

新建Views文件夹 ,IGongAnView.cs 接口 如下

    public interface IGongAnView
    {
        void getServiceGongAnSuccess(Data model);
        void getServiceGonganFail(string  error);
    }

新建Model文件夹,SearchGongAn.cs如下:

    public class SearchGongAn
    {
       private  static string  url= "https://www.sojson.com/api/gongan/{0}";
        public static async System.Threading.Tasks.Task<GongAnModel> getGonganDetail(string city)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(string.Format(url, city));
                request.Method = "get";
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream responseStream = response.GetResponseStream();
                StreamReader streamReader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
                string result = await streamReader.ReadToEndAsync();
                GongAnModel model = JsonConvert.DeserializeObject<GongAnModel>(result);
                streamReader.Close();
                responseStream.Close();
                return model;
            }
            catch (Exception ex)
            {
                Log.Info("ex",ex.ToString());
                return null;
            }
        }
    }

Mainactivity.cs

 [Activity(Label = "PeresenterForXamarinAndroid", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity,IGongAnView,View.IOnClickListener
    {
        TextView txt_result;
        Button btn_search;
        EditText btn_sitedomain;
        GongAnPresenter presenter;
        ProgressDialog progressDialog;
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Main);
            txt_result = FindViewById<TextView>(Resource.Id.txt_result);
            btn_search = FindViewById<Button>(Resource.Id.btn_search);
            btn_sitedomain = FindViewById<EditText>(Resource.Id.btn_sitedomain);
            presenter = new Peresenter.GongAnPresenter(this);
            progressDialog = new ProgressDialog(this);
            progressDialog.SetTitle("搜索公网备案");
            progressDialog.SetMessage("正在搜索,请稍后.....");
            btn_search.SetOnClickListener(this);
        }

        public void OnClick(View v)
        {
            if (v.Id == Resource.Id.btn_search)
            {
                string sitedomain = btn_sitedomain.Text;
                string pattern = @"^[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$";
                Regex reg = new Regex(pattern);
                if (string.IsNullOrEmpty(sitedomain))
                {
                    Toast.MakeText(this, "请输入域名", ToastLength.Short).Show();
                }
                else if (reg.IsMatch(sitedomain))
                {
                    progressDialog.Show();
                    presenter.showResult(sitedomain);
                }
                else
                {
                    Toast.MakeText(this, "域名错误,请重新输入", ToastLength.Short).Show();
                }
            }
        }
        public void getServiceGongAnSuccess(Data model)
        {
            progressDialog.Hide();
            txt_result.Text = "工信部更新日期:" + model.cdate.ToShortDateString() + "\n公司地址:" + model.comaddress + "\n公司名称:" + model.comname + "\n网备案号:" + model.id + "\n域名" + model.sitedomain + "\n简称:" + model.sitename;
        }

        public void getServiceGonganFail(string error)
        {
            progressDialog.Hide();
            txt_result.Text = "查询失败";
            Toast.MakeText(this,error,ToastLength.Short).Show();
        }
    }

总结

纸上得来终觉浅,绝知此事要躬行。只要不断实践,丰富项目经验,架构模式在初学者前期并不是那么重要。android开发无外乎就三种架构MVC、MVP、MVVM。MVP模式简单易用非常容易上手,Presenter隔断了View和Model的联系,作为两者沟通的桥梁,在Activityhe fragment中你的代码就不会变得臃肿,杂乱了。
引用一句我非常喜欢的话:

架构只是一种思维模式,不管是MVC、MVP还是MVVM,都只是一种思考问题的思维,其目的还是要解决变成过程中高内聚、低耦合、可维护、易测试。

阅读更多
版权声明:本文为博主原创文章,未经博主允许转载随意。 https://blog.csdn.net/kebi007/article/details/80355351
个人分类: Xamarin android .net
所属专栏: xamarin android入门详解
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

MVP架构在xamarin android中的简单使用

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭