本文目的:对app设计架构有一个初步的了解;
**为什么需要架构设计(代码在10万行以上)
1,使我们的程序模块化(分工协同开发的需要),模块内部的高内聚和模块之间的低耦合;
2,提高开发效率,后期的测试以及定位会变得更容易
**android中MVC设计架构
1,android中的设计架构都是来源于javaweb当中一些思想和模式
2,android中界面部分就是采用当前比较流行的MVC架构!
V:视图层
进行数据的展示;xml文件,可以理解为app中的View;
C:控制层:contorller
android中的控制层就是Activity;在改层可以绑定数据,获取控件,业务逻辑;android中的activity的相应时间是5秒;如果耗时操作放在这里程序就容易被回收掉
M:模型层model
主要是针对业务模型;建立数据结构和相关的类;与View无关但与业务有关
对数据库的操作,对网络的操作都应该放在model层。android中的mvc注重的是model的复用!
下面写一个例子,我们看看MVC的优缺点
我们先看下包和类的结构
我们看下视图层:
视图层比较简单,只有一个按钮和三个TextView
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<Button
android:id="@+id/get_user"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="得到用户信息" />
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_sex"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
在看下Controller层,就是我们的MainActivity
package com.controller.gang;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.example.jiagou.R;
import com.model.gang.IGetUser;
import com.model.gang.OnUserInfoListenner;
import com.model.gang.User;
import com.model.gang.impl.GetUserInfoImp;
//Activity(控制层)需要做的事情
//1,获取控件
//2,处理事件
//3,获取数据
//4,控件绑定数据
public class MainActivity extends Activity {
private IGetUser mIGetUser;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 获取控件
setContentView(R.layout.activity_main);
tv_name = (TextView) findViewById(R.id.tv_name);
tv_age = (TextView) findViewById(R.id.tv_age);
tv_sex = (TextView) findViewById(R.id.tv_sex);
btn = (Button) findViewById(R.id.get_user);
// 获取数据
mIGetUser = new GetUserInfoImp();
// 获取数据是耗时操作,使用进度条
ProgressDialog pd = new ProgressDialog(this);
pd.setMessage("正在加载");
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
getUserInfoImp(1);
}
});
}
protected void getUserInfoImp(int i) {
// 将数据与控件进行绑定
// 获取数据要从model层拿
// 该方法为耗时操作,不能直接赋值
mIGetUser.getUserInfo(i, new OnUserInfoListenner() {
@Override
public void getUusrInfoSuccess(final User user) {
mHandler.post(new Runnable() {
@Override
public void run() {
tv_name.setText(user.getName());
tv_sex.setText(user.getSex());
tv_age.setText(String.valueOf(user.getAge()));
}
});
}
@Override
public void getUusrInfoFail() {
mHandler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "获取信息失败", Toast.LENGTH_SHORT).show();
}
});
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private Handler mHandler = new Handler();
private TextView tv_name;
private TextView tv_age;
private TextView tv_sex;
private Button btn;
}
Model层类比较多,一个类一个类的贴
package com.model.gang;
//获取数据的接口 ,方便获取数据
public interface IGetUser {
void getUserInfo(int id,OnUserInfoListenner listenner);
}
package com.model.gang;
//
public interface OnUserInfoListenner {
//回调方法
void getUusrInfoSuccess(User user);
void getUusrInfoFail();
}
package com.model.gang;
public class User {
private String name;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
private int age;
}
package com.model.gang.impl;
import com.model.gang.IGetUser;
import com.model.gang.OnUserInfoListenner;
import com.model.gang.User;
//获取数据,获取数据是在model层
// 可以在网络,数据库,服务器,文件等获取数据
public class GetUserInfoImp implements IGetUser {
@Override
public void getUserInfo(final int id, final OnUserInfoListenner listenner) {
// 模拟子线程耗时操作
new Thread() {
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (id == 1) {
User user = new User();
user.setName("葛柳君");
user.setAge(18);
user.setSex("动物");
// 谁实现了该监听谁就得到了这个数据
listenner.getUusrInfoSuccess(user);
} else {
listenner.getUusrInfoFail();
}
}
}.start();
}
}
以上就是我们的mvc架构;但这个架构也有缺点;在Activity中既要进行获取控件,又要获取数据,还要绑定数据,还要处理事件;Activity承担了太多的逻辑,违背了面向对象的单一职能原则;