android应用开发MVC框架(一)

前言

android应用开发中,很多时候都在找适合自己应用的一种框架,便于应用的更为合理开发,也易于应用功能的扩展,但其实并没有说哪一种架构就是对所有应用都是适应的,所以我们只能在学习摸索之中找到适合我们自己应用的架构,在这里我就写一种比较常用的mvc架构,以后的后续博客当中还会有其他的方式分享给大家。很久之前就很想写一些关于开发过程中学习到的东西,可以跟开发者交流学习,这几天有些时间,果断就开始了。这是我的第一篇博客,写得不好还望提出批评建议。


什么是mvc?

说什么是mvc,百度概念是这样讲的:MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑和数据显式分离的方法组织代码,将业务逻辑被聚集到一个部件里面,在界面和用户围绕数据的交互能被改进和个性化定制的同时而不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。(摘自百度)

通俗点来讲,利用mvc架构进行开发,能够将获取数据部分的代码跟数据展示部分的代码进行分离,能够在很大程度降低业务逻辑和数据显示之间的耦合性,易于代码的修改跟复用。看过一个例子很形象:就比如你有一堆数据,你可以选择用柱形图或者饼状图来显示,你怎样展示这些数据是跟你怎样得到这些数据是没有多大关系的。

用mvc的好处:利用mvc架构进行开发也有很多好处,就比如说开发小组当中,做界面的可以认真做着自己的界面,而负责业务逻辑部分的猿哥也可以钻研自己的业务逻辑,将其优化到最好;还有就是利用架构进行开发,可以让你的应用更模块化,扩展性更强。

下面就简单介绍一下各个层的一个作用,然后直接上图上代码,这样也来得直接一点。

不过还要说明一点,个人理解,就是mvc架构只是一种应用架构的设计模式,但实现方式并不是说只有一种,只要你不离这个原理,可以自己进行设计打造更加适合自己开发应用的一种架构。好了,这次真的不再啰嗦。

M:模型层(Model),获取数据、对数据进行操作处理部分,对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在的该层的。

V:视图层(View),展示数据部分,一般都是使用XML搭界面,所以数据也就自然而然在这里进行展示,当然android应用界面的搭建还可以用HTML5等进行搭建,但这些不是这篇文中要讨论的。

C:控制层(Controller),android中的控制层是落在activity上,activity从Model层获取到数据之后,将其放到View层上面进行展示,这也让我们清楚,不要再activity当中写处理业务逻辑方面的代码,尤其是耗时的操作更加不能在这里写。


先看一下应用的架构:

这里解释一下:其中model包放的就是业务逻辑层的类,protocol包放的就是封装过的数据实体类,ui包就是activity,而下面的layout下的XML文件就是所谓的view层。大致是可以这样分的,当然也可以按照自己需求进行扩展,我在这里也就很简单的展示出整个应用的核心。


先看一下结果,也就是在model中模拟一个数据,经过处理在界面显示而已。



下面就展开到每个类来做解释:

1、person实体类,封装了person这个数据的属性和方法 

package com.kroc.protocol;
/**
 * 
 * @author 楷鹏
 * @描述 person实体类,封装了person这个数据的属性和方法
 *
 */
public class PERSON {

	private int id;
	private int age;
	private String name;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "PERSON [id=" + id + ", age=" + age + ", name=" + name + "]";
	}
}

2、业务处理层的基类

package com.kroc.model;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @author 林楷鹏
 * @描述 业务处理层的基类,所有业务类都可以继承此类,这里可以负责处理一些通用的问题。比如联网超时,找不到服务器等。
 *
 */
public class BaseModel implements BusinessResponse{
	//存放响应的列表
	private List
    
    
     
      responseList = new ArrayList
     
     
      
      ();
	
	@Override
	public void OnMessageResponse(Object... results) {
		//迭代将列表中的响应回调到activity中,回调之前可以先处理一下,比如判断回调的状态值等等
		for(BusinessResponse response : responseList){
			//这里可先处理一下再将其回调到activity
			System.out.println("BaseModel里先处理了一次");
			response.OnMessageResponse(results);
		}
	}
	/**
	 * 将响应加到响应列表当中
	 * @param response
	 */
    public void addResponseListener(BusinessResponse response)
    {
        if (!responseList.contains(response))
        {
        	responseList.add(response);
        }
    }

}

     
     
    
    

3、person业务处理类


package com.kroc.model;

import com.kroc.protocol.PERSON;
/**
 * 
 * @author 楷鹏
 * @描述 person业务处理类
 *
 */
public class PersonModel extends BaseModel{

	private PERSON person;
	/**
	 * 获取person数据
	 */
	public void getPerson() {
		//数据逻辑处理部分,这部分为模拟数据,真正应用时此处可以是获取网络数据等等
		person = new PERSON();
		person.setId(1);
		person.setAge(15);
		person.setName("小明");
		//将得到的数据进行回调
		PersonModel.this.OnMessageResponse(person);
	}

}


4、响应回调接口


package com.kroc.model;
/**
 * 
 * @author 林楷鹏
 * @描述 响应回调接口
 *
 */
public interface BusinessResponse {
	/**
	 * 回调访问结果的函数
	 * @param results 此参数为可变参数,可以按照自己需求对参数进行修改
	 */
	public abstract void OnMessageResponse(Object...results);
}


5、activity


package com.kroc.ui;

import com.kroc.model.BusinessResponse;
import com.kroc.model.PersonModel;
import com.kroc.protocol.PERSON;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
/**
 * 
 * @author 楷鹏
 * @描述 主页面
 *
 */
public class MainActivity extends Activity implements BusinessResponse{
	
	private PersonModel personModel;//声明一个person的业务类对象
	private TextView textView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		textView = (TextView)findViewById(R.id.text);
		
		personModel = new PersonModel();//对业务类进行实例化
		personModel.addResponseListener(this);//注册响应监听器,经过注册,返回结果可以在OnMessageResponse方法得到
		personModel.getPerson();//获取数据
	}

	@Override
	public void OnMessageResponse(Object... results) {
		System.out.println("回调了");
		//处理回调数据
		PERSON person = (PERSON)results[0];
		textView.setText(person.toString());
		System.out.println("person:"+person.toString());
	}


}


6、activity_main.xml


  
  

    
   
   


  
  


结束语

基本上就是这样,各个类里面都有注释,大家可以参照注释进行学习,也能够根据此为基础进行扩展,我觉得这个小小的demo的框架经过扩展之后还是很不错的,可以用以开发代码量比较多的APP,如果有什么问题或者此demo有不好之处还请评论交流学习。好啦,也就差不多这样。

~~点击下载代码~~



  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
使用android studio 运行,下面是一个简单的文档,这个代码是一个demo 一、Activity的使用 1、SNActivity 框架最基本的activity,可调用$(SNManager)进行操作activity,具体用法请参考文档或代码 2、SNNavigationSlidingActivity 包含SNActivity的功能,继承于com.jeremyfeinstein.slidingmenu.lib.app.SlidingActivity 支持导航条和左滑视图的Activity 加载导航条: loadNavBar(int height,int background_color_id) loadNavBarResId(int height_id,int background_id) 加载左侧视图: /** * load left view * @param left_id left layout id * @param offset_value offset value * @param shadow_width_value shadow width value * @param shadow_drawable_id shadow drawable style * @param fade fade value */ loadLeft(int left_id, int offset_value, int shadow_width_value, int shadow_drawable_id, float fade) /** * load left view * @param left_id left layout id * @param offset_id offset id * @param shadow_width_id shadow width id * @param shadow_drawable_id shadow drawable id * @param fade fade value */ loadLeftResId(int left_id, int offset_id, int shadow_width_id, int shadow_drawable_id, float fade) 二、SNElement的使用 View的伪装对象,支持所有View的功能,详细功能可参考文档或代码 手动伪装:$.create $.id $.findView 注入伪装:$.setContent(view class or layout id,inject class); 获取原型:elem.toView(); 三、注入 1、视图注入 A、创建注入类,属性名称必须和layout中的id对应,如果不对应请加入标签@SNInjectView class DemoInject{ @SNInjectView(id=R.id.tvTest) public SNElement test; } B、实例化注入对象 DemoInject di=new DemoInject(); C、调用$.inject或者$.setContent注入 $.inject(di); D、注入成功后即可调用对象 String text=di.test.text(); 2、依赖注入 A、需要绑定注入对象,建议写到Application中的onCreate SNBindInjectManager.instance().bind(ITest.class, Test.class); B、与视图注入不同的是属性必须添加标签@SNIOC,注入的对象(Test)必须包含只有一个SNManager参数的构造函数,且必须实现注入者 public class Test implements ITest{ SNManager $; public Test(SNManager _$){ this.$=_$; }; } class DemoInject{ @SNIOC public ITest test; } C、调用$.inject或者$.setContent注入 同视图注入 D、注入成功后即可调用对象 di.test.xxx(); 四、fragment的使用 1、SNFragment 2、SNLazyFragment 五、控件的使用 1、SNFragmentScrollable 2、SNPercentLinearLayout、SNPercentRelativeLayout 3、SNScrollable 4、SNSlipNavigation 5、XList 6、slidingtab

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值