文档章节

Android MVC之我的实现

wisely
 wisely
发布于 2013/08/04 21:22
字数 737
阅读 1096
收藏 11
点赞 1
评论 3

做了一年多的Android开发,开始积累了一点Android开发方面的经验。所以想抽点时间总结归纳一下。
基本上所有的程序员,都有一种对美的追求。代码所谓的美来自於抽象。要追求怎样的美,怎样的抽象,取决於:工作的现况,程序员的专业能力,性格与自我的要求。最重要的是,将代码适度的抽象,进而转化为知识的积累,那是一趟自我不断提升的美好旅程。

这个程序使用了github上的一个开源的sidebar框架,作者为:Julian Chu (a.k.a walkingice) walkingice0204@gmail.com


项目的目录结构如图,
MainActivity和AnimationLayout是sidebar的关键部分,
workerService是业务逻辑模块,毫无疑问MainActivity和两个Fragment就是视图模块。
这样设计的目的主要是为了让视图和业务逻辑分离,所有的业务逻辑都在Service中,当Service中
处理完业务后,通过Broadcast通知Activity和Fragment改变UI,而Activity调用业务逻辑则通过Intent来
实现。

代码明细
MainActivity

//初始化sidebar和Fragment组件
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        IntentFilter filter = new IntentFilter(CHANGE_VIEW);
		receiver = new ChangeViewReceiver();
		registerReceiver(receiver, filter);
        mLayout = (AnimationLayout) findViewById(R.id.animation_layout);
        mLayout.setListener(this);

        mList   = (ListView) findViewById(R.id.sidebar_list);
        mList.setAdapter(
                new ArrayAdapter<String>(
                    this, android.R.layout.simple_list_item_1
                    , mStrings));
        
       final  FragmentManager fm = getSupportFragmentManager();
        mList.setOnItemClickListener(new AdapterView.OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
				// TODO Auto-generated method stub
				String name=(String)parent.getAdapter().getItem(position);
				Log.i(TAG, "vlaue="+name+",position="+position+",id="+id);
				FragmentTransaction ft=fm.beginTransaction();
				Fragment main=fm.findFragmentByTag("main");
				if(main!=null){
					ft.remove(main);
				}
				ft.add(R.id.animation_layout_content, switchFragment(position), "main");
				ft.commit();
				mLayout.closeSidebar();
			}
        	
		});
//        mList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    }
//MainActivity中的BroadcastReceiver,用来接收Service发送过来的事件,并改变UI
	class ChangeViewReceiver extends BroadcastReceiver {

		@Override
		public void onReceive(Context ctx, Intent intent) {
			String action=intent.getAction();
			Log.i("lcm", "ChangeViewReceiver,action="+action);
			if(action!=null){
				if(action.equals(CHANGE_VIEW)){
					String msg=intent.getStringExtra("msg");
					if(msg.equals("viewid")){
						FragmentManager fm = getSupportFragmentManager();
						Fragment ft=fm.findFragmentByTag("main");
						//动态改变Fragment中控件的状态
						LinearLayout viewRoot=(LinearLayout)ft.getView().findViewById(R.id.fragment_b_root);
						EditText edit=(EditText)viewRoot.findViewById(R.id.editText1);
						edit.setText("你好啊");
						//或者也可以动态的添加控件
//						LinearLayout child=new LinearLayout(getApplicationContext());
//						child.setLayoutParams(LP_FW);
//						child.setBackgroundResource(R.color.mybak);
//						viewRoot.addView(child);
					}else if(msg.equals("viewtag")){
						
					}
				}
			}
		}

	}
HelloFragment
//定义一个接口让Activity来实现,就可以方便的调用Activity中的资源
	public interface OnArticleSelectedListener{
		 public void onArticleSelected(String action);
	}
WorkerService
@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		// TODO Auto-generated method stub
//		return super.onStartCommand(intent, flags, startId);
		String action=intent.getAction();
		Log.i("lcm", "action="+action);
		if(action.equals(CHANGE)){
			//在这里处理具体的业务逻辑,比如执行网络操作,磁盘操作或者数据库操作
			//为了简单起见,这里直接向Activity发送改变UI的广播
			sendBroadcast("viewid");
		}
		return START_STICKY;
	}

完整的项目下载:
http://pan.baidu.com/share/link?shareid=3007225400&uk=1611114851

这个项目只是我的一点不成熟的想法,欢迎提出有用的建议,
关于为什么我没有提取出一个公共的Fragment的问题,那是因为我现在开发的那个程序,跟oschina的手机客户端业务相差很大,每个界面的UI几乎完全不同,不像oschina每个界面基本都是ListView。

© 著作权归作者所有

共有 人打赏支持
wisely

wisely

粉丝 32
博文 32
码字总数 9217
作品 0
杭州
程序员
加载中

评论(3)

wisely
wisely

引用来自“QLi”的评论

用hander 异步好点

BroadcastReciver就等于全局的Handler,Handler能接受从其它类发过来的消息吗,这个没试过。或者可以把你的实现写出来看看。
QLi
QLi
用hander 异步好点
韩吉吉
韩吉吉
改天拜读
我的Android重构之旅:架构篇

EF A舞蹈服 去年10月底来到了新公司,刚开始接手 Android 项目时,发现该项目真的是一团遭,项目开发上没有任何架构可言,开发人员连简单的 MVC、MVP 都不了解,Activity 及其臃肿,业务边界...

codeGoogle
05/31
0
0
阅读#ThinkAndroid#笔记(一)

今天看了ThinkAndroid源码的MVC实现部分,觉得存在不少问题。 一、设计TAActivity超类不合理 ThinkActivity框架要求所有的Activity组件继承TAActivity类,而TAActivity类是直接继承Activity类...

Callen
2015/08/08
0
0
MVP架构在xamarin android中的简单使用

好几个月没写文章了,使用xamarin android也快接近两年,还有一个月职业生涯就到两个年了,从刚出来啥也不会了,到现在回头看这个项目,真jb操蛋(真辛苦了实施的人了,无数次吐槽怎么这么丑...

操张林
05/17
0
0
Android中MVP模式的了解及实例

Android中MVP的由来 在了解MVP之前我相信很多人已经学习过MVC这个框架了!MVP的诞生可以说是建立在MVC在安卓某些不足的方面 MVC简介 .M对应Model,代表业务数据 .V对应View,代表视图 .C对应C...

九尾74
05/26
0
0
Android 框架设计Demo

项目的业务逻辑不断变更,需求也不断扩张,导致在原有代码基础上去处理也变得越来越繁琐,这时项目框架和代码规范就显得非常必要了。Google 在 GitHub 上的 Android Architecture Blueprint...

全部原谅
07/17
0
0
老生常谈Android的MVP架构

原生框架问题 由于原生 Android 开发应该已经是一个基础的 MVC 框架,所以在初始开发的时候并没有遇到太多框架上的问题,可是一旦项目规模到了一定的程度,就需要对整个项目的代码结构做一个...

LaxusJ
04/23
0
0
Android MVC实现一个音乐播放器

MVCPlayer 我尝试在android上使用MVC模式来开发一个音乐播放器。GitHub地址:https://github.com/skyhacker2/MVCPlayer 什么是MVC 来自维基百科 控制器 Controller - 负责转发请求,对请求进...

Nov_Eleven
2015/05/16
0
0
Android自定义控件View的探讨

本文转载自:http://www.apkbus.com/forum.php?mod=viewthread&tid=242501&extra=page%3D1 做过了一段时间的安卓开发都会接触到自定义控件,那么对于自定义控件大家都有什么样的看法呢?自定...

谁带我去看看世界
2015/06/24
0
0
50个Android开发技巧(20 使用MVP模式)

在提供了2个链接,其中一个是原文的链接 http://yeungeek.com/2014/06/17/mvp-android/ http://blog.csdn.net/vectoryi/article/details/24719873 一、MVP介绍 随着UI创建技术的功能日益增强...

moz1q1
2015/03/08
0
1
程序员挑战高薪,你必须会的十大面试题《一》

程序员挑战高薪,你必须会的十大面试题《一》 IT蓝豹 1:Android中五种数据存储方式分别是什么?他们的特点? (1)SharedPreference,存放较少的五种类型的数据,只能在同一个包内使 用,生成...

抉择很难
2015/11/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

rabbitmq学习记录(六)交换机Exchange-direct

实现功能:一条消息发送给多个消费者 交换机模式:direct 相比于之前的fanout模式,可以进一步的筛选获取消息的消费者。 fanout模式下,只要消费者监听的队列,已经与接收生产者消息的交换机...

人觉非常君
10分钟前
0
0
Java 之 枚举

Java 中声明的枚举类,均是 java.lang.Enum 类的子类,Enun 类中的常用方法有: name() 返回枚举对象名称 ordinal() 返回枚举对象下标 valueOf(Class enumType, String name) 转换枚举对象 ...

绝世武神
19分钟前
0
0
使用爬虫实现代理IP池之放弃篇

啥叫代理IP以及代理IP池 概念上的东西网上搜索一下就好了,这里简单科普一下(大部分会读这篇文章的人,基本是不需要我来科普的),白话说就是能联网并提供代理访问互联网的服务器,它提供的...

一别丶经年
35分钟前
0
0
sqoop导入数据到Base并同步hive与impala

使用Sqoop从MySQL导入数据到Hive和HBase 及近期感悟 基础环境 Sqool和Hive、HBase简介 Sqoop Hive HBase 测试Sqoop 使用Sqoop从MySQL导入数据到Hive 使用复杂SQL 调整Hive数据类型 不断更新 ...

hblt-j
今天
0
0
Dart 服务端开发 文件上传

clent端使用angular组件 upload_component.html form id="myForm" method="POST" enctype="multipart/form-data"> <input type="file" name="fileData"> <!-- file field --></form>......

scooplol
今天
0
0
apache和tomcat同时开启,乱码问题

tomcat和apache同时开启,会走apache的转发,执行的是AJP/1.3协议。所以在tomcat的配置文件server中, <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" useBodyEncodingForU......

Kefy
今天
0
0
使用ssh-keygen和ssh-copy-id三步实现SSH无密码登录 和ssh常用命令

ssh-keygen 产生公钥与私钥对. ssh-copy-id 将本机的公钥复制到远程机器的authorized_keys文件中,ssh-copy-id也能让你有到远程机器的home, ~./ssh , 和 ~/.ssh/authorized_keys的权利 第一步...

xtof
今天
0
0
orcale 查询表结构

SELECT t.table_name, t.colUMN_NAME, t.DATA_TYPE || '(' || t.DATA_LENGTH || ')', t1.COMMENTS FROM User_Tab_Cols t, User_Col_Comments t1WHERE t.table_name......

wertwang
今天
0
0
华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大

华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大!华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大! 在华为最新发布的nova 3手机上,抖音通过华为himedia SDK集成了60fps、超级...

华为终端开放实验室
今天
0
0
多 SSH Key 实现同一台服务器部署多 Git 仓库

本文以以下需求为背景,介绍详细的做法: 需在同一台服务器同时部署两个不同的 Github 仓库(对 Bitbucket 等 git 服务同样适用) root 用户可在远程登录 SSH 后附上预期的 SSH Key 进行 gi...

yeahlife
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部