文章目录

MVC (Model-View-Controller):M是指逻辑模型,V是指视图模型,C则是控制器。一个逻辑模型可以对于多种视图模型

使用MVC的目的是将M和V的实现代码分离,方便扩展,便于以后的管理

从开发者的角度,MVC把应用程序的逻辑层与界面是完全分开的,最大的好处是:界面设计人员可以直接参与到界面开发,程序员就可以把精力放在逻辑层上。

虽然理论上可以实现,但实践起来还是感觉不能完全分开…

Android中也可以说采用了当前比较流行的MVC框架,在Android中:

  1) 视图层(View):一般采用XML文件进行界面的描述,使用的时候可以非常方便的引入,但是用xml编写了,又需要在Acitvity声明并且实例化,有点麻烦,考虑能否做一个类似注解实现匹配,或者写一个类获取xml的各个节点然后自动进行封装,当然,这只是个想法,以后再实现。

  2) 控制层(Controller):Android的控制层的重任通常落在了众多的Acitvity的肩上,要通过Activity交割Model业务逻辑层处理,这样做的另外一个原因是Android中的Acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。

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

这是我的目录结构:

 

 

 代码讲解:

模型层(Model): 分了model包和dao包,

model包主要是对对象的封装和一些简单的对象逻辑

dao包主要是对数据库的操作和对网络的操作

MODEL:

\

public class User {
private int id;
private String realname;

public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
public String getRealname() {
    return realname;
}
public void setRealname(String realname) {
    this.realname = realname;
}
public User(int id, String realname) {
    super();
    this.id = id;
    this.realname = realname;
}
public User() {
    super();
}

}

DAO:

 

\

public class VoteDao extends BaseDao{

public String login(String mac){
    String[] para = { "user.mac"};
    String[] data = {mac};
    return getData(Cons.URL_LOGIN, para, data);//getData是自己封装的网络访问类
}}</pre>

 

视图层(View):

对安卓来说,就是XML的布局文件。用代码实现android布局不明智

 

控制层(Controller):

activity包,Android的控制层的重任通常落在了众多的Acitvity的肩上,要通过Activity交割Model业务逻辑层处理。但是所有的控制层逻辑都写在activity又感觉太臃肿了,一个activity几百行代码,维护起来也不方便,所以就分了一个ctrler的包。

ctrler包:activity包主要实现与视图层的逻辑处理,ctrler包更多用于实现与model层的业务逻辑处理。

adapter:不用多说,android自己实现的数据和UI(View)之间一个重要的纽带,**直观的表达了Data、Adapter、View三者的关系。**

 

activity:  (主要实现从服务器做登陆,并且获取通知初始化listview)

三步走  (不同布局都一样,三步走):

一、initView();初始xml的视图布局

二、getData(); 获取数据

三、initAdapter(); 初始数据

 

\

public class MainActivity extends Activity{
public static SharedPreferences sharedPreferences;
private ListView listView;
private MenuAdapter nAdapter; //通知
private List<Notice> notices;
private List<Notice> showingNotices = new ArrayList<Notice>();
private Handler handler;
private User user;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);
    sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);

    handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case OperCons.INIT:
                initAdapter();
                break;

            case OperCons.SHOW_TIPS:
                if(notices == null)
                    MyToast.makeText(getApplicationContext(), &quot;获取通知失败,请检查网络&quot;, Toast.LENGTH_SHORT);
                else
                    MyToast.makeText(getApplicationContext(), &quot;暂无通知&quot;, Toast.LENGTH_SHORT);
                break;

            default:
                break;
            }
        }
    };
    initView();
}

private void initView(){
    //下方列表
    listView = (ListView) findViewById(R.id.my_list);
    nAdapter = new MenuAdapter(getApplicationContext(),R.layout.news_item);
    listView.setAdapter(nAdapter);
    //缓存拿,先初始化
    String result = MainActivity.sharedPreferences.getString(&quot;notice&quot;, null);
    if(result!=null &amp;&amp; !&quot;[]&quot;.equals(result)){
        notices = JsonUtil.jsonToObjectList(result, Notice.class);
        if(notices !=null &amp;&amp; notices.size()&gt;0)
            handler.sendEmptyMessage(OperCons.INIT);
    }
    user = VoteCtrler.getInstance().login();
    getNotice();
}

private void getNotice(){
    new Thread(){
        @Override
        public void run() {
            notices = VoteCtrler.getInstance().getNotice();
            if(notices!=null &amp;&amp; notices.size()&gt;0)
                handler.sendEmptyMessage(OperCons.INIT);
            else
                handler.sendEmptyMessage(OperCons.SHOW_TIPS);
            super.run();
        }
    }.start();
}

private void initAdapter(){
    showingNotices.clear();
    showingNotices.addAll(notices);
    nAdapter.clear();
    MyAndroidUtil.editXml(&quot;notice&quot;, showingNotices);
    for(Notice notice : notices){
        nAdapter.add(notice.getTitle());
    }
}

}

ctrler: (负责业务逻辑,通过此类获取数据并返回给activity处理视图逻辑)

\

public class VoteCtrler {
private static VoteCtrler instance;
private VoteDao voteDao;

public VoteCtrler(){
    voteDao = new VoteDao();
}

public synchronized static VoteCtrler getInstance(){
    if(instance == null)
        instance = new VoteCtrler();
    return instance;
}

public User login(){
    //更多业务逻辑,请在这里完成
    String result = voteDao.login(&quot;xxx&quot;);
    if(result !=null){
        User user = JsonUtil.jsonToObject(result, User.class);
        return user;
    }
    return null;
}

public List&lt;Notice&gt; getNotice(){
    String result  = voteDao.getNotice();
    if(result !=null)
        return JsonUtil.jsonToObjectList(result, Notice.class);
    return null;
}

}

config是项目的一些常用数据的配置

util是放工具类的

 

以上是个人对android里的mvc模式的个人见解,主要是一开始经常会把所有逻辑直接写在activity里,导致activity很臃肿,维护不方便,导致activity里代码过于集中,所以强行把项目结构改成这样。

如果大家有更好的项目结构希望可以告诉我,小团队开发只能靠自己摸索…欢迎大神拍砖大笑

 

 

 

 

 

文章目录