王学岗app设计框架:mvc框架

本文目的:对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承担了太多的逻辑,违背了面向对象的单一职能原则;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值