Android 开发 代码结构规范 MVC模式

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是自己封装的网络访问类
     }}

视图层(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(), "获取通知失败,请检查网络" , Toast.LENGTH_SHORT);
                     else
                         MyToast.makeText(getApplicationContext(), "暂无通知" , 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( "notice" , null );
         if (result!= null && ! "[]" .equals(result)){
             notices = JsonUtil.jsonToObjectList(result, Notice. class );
             if (notices != null && notices.size()> 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 && notices.size()> 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( "notice" , 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( "xxx" );
         if (result != null ){
             User user = JsonUtil.jsonToObject(result, User. class );
             return user;
         }
         return null ;
     }
 
     public List<notice> getNotice(){
         String result  = voteDao.getNotice();
         if (result != null )
             return JsonUtil.jsonToObjectList(result, Notice. class );
         return null ;
     }
}

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

util是放工具类的

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值