MVC的使用及理解

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。其中M层处理数据,业务逻辑等;V层处理界面的显示结果;C层起到桥梁的作用,来控制V层和M层通信以此来达到分离视图显示和业务逻辑层。说了这么多,听着感觉很抽象,废话不多说,我们来看看MVC在Android开发中是怎么应用的吧!
在这里插入图片描述
我写的是一个网络请求数据MVC的写法来看一下具体代码

主题思想

  1. 新建BaseActivity抽取OnCreate的方法(加载布局,监听事件,初始化控件,页面逻辑处理这几个方法)
  2. 创建MyCallBack接口(接受请求数据反馈回来的几种状态)
  3. 创建Model接口(业务逻辑处理调用的方法)
  4. 创建ModelImpl(处理网络请求的一些方法)
  5. MainActivity继承继承BaseActivity中的抽象方法并实现MyCallBack接口
  6. 既然要做网络请求操作,那么权限就一定不要忘
  7. 还有依赖

好了思路就是这些下面展示代码

这是我分明的层次
在这里插入图片描述
首先是BaseActivity

public abstract class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        init();
    }

    //加载布局的方法
    protected abstract int getLayout();
    //找控件的方法
    protected abstract void initViews();
    //点击事件的方法
    protected abstract void setOnClick();
    //页面逻辑处理
    protected abstract void processLogic();

    void init(){
        if(getLayout()!=0){
            //逻辑代码    当有布局的时候才能添加    使用OnCreatView中的setContentView()方法加载布局
            setContentView(getLayout());
            initViews();
            setOnClick();
            processLogic();
        }else{
            //加载布局
            throw new IllegalStateException("请先加载布局");
        }
    };

}

MyCallBack

//MyCallBack 接口是Model层请求信息的传递载体,所以需要在MyCallBack中定义数据请求的各种反馈状态:

public interface MyCallBack {

    void success(String success);

    void error(String error);

}

Model

public interface Model {
    void getData(String url, MyCallBack myCallBack);
}

ModelImpl

//ModelImpl 类中定了具体的网络请求操作。为模拟真实的网络请求,利用网络请求模拟耗时操作,通过判断请求参数反馈不同的请求状态:
public class ModelImpl implements Model{

    private MyCallBack myCallBack;
    private Handler mhandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //得到数据
            String obj = (String) msg.obj;
            Bean data = new Gson().fromJson(obj, Bean.class);
            //如果数据不为空就将数据传入声明的MyCallBack中的success方法中
            if(myCallBack!=null){
                myCallBack.success(data+"");
            }
        }
    };


    @Override
    public void getData(final String url, final MyCallBack myCallBack) {
        this.myCallBack = myCallBack;
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    URL newurl = new URL(url);
                    HttpURLConnection connection = (HttpURLConnection) newurl.openConnection();
                    connection.setReadTimeout(5000);
                    if(connection.getResponseCode()==200){
                        String data = CharStreams.toString(new InputStreamReader(connection.getInputStream(), "UTF-8"));
                        Message message = Message.obtain();
                        message.obj = data;
                        mhandler.sendMessage(message);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

MainActivity


//继承BaseActivity中的抽象方法
//并实现OnClick和MyCallBack的接口
public class MainActivity extends BaseActivity implements View.OnClickListener ,MyCallBack{

    private Button btn;
    private TextView text;
    private ModelImpl model;
    private String httpurl = "http://api.expoon.com/AppNews/getNewsList/type/1/p/1";

    @Override
    protected int getLayout() {
        //加载布局
        return R.layout.activity_main;
    }

    @Override
    protected void initViews() {
        //初始化控件
        btn = findViewById(R.id.Send_Btn);
        text = findViewById(R.id.Get_Text);
    }

    @Override
    protected void setOnClick() {
        //声明按钮点击事件
        btn.setOnClickListener(this);
    }

    @Override
    protected void processLogic() {
        //实例化ModelImpl      这一步是为了让我实现ModelImpl里网络请求的操作
        model = new ModelImpl();
    }

    @Override
    public void onClick(View view) {
       switch (view.getId()){
           case R.id.Send_Btn:
               //在这里这个this代表了MyCallBack    因为本类实现了MyCallBack的接口所以也就是MyCallBack的子类  即MyCallBack = MainActivity.this
                model.getData(httpurl,this);
               break;
       }
    }

    @Override
    public void success(String success) {
        //赋值操作
        if(!success.isEmpty()){
            text.setText(success);
        }
    }

    @Override
    public void error(String error) {

    }
}

最后一定一定要记得在AndroidManifest.xml中加入这个权限

<uses-permission android:name="android.permission.INTERNET"/>

依赖

implementation 'com.google.code.gson:gson:2.2.4'
implementation 'com.google.guava:guava:16.0.1'

这样看MainActivity舒服多了,代码也容易看懂,不显得乱
如果没有理解的话可以看详细的项目中的代码
地址:https://github.com/qq1341738311/MVC_Demo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值