尝试着做了一个乞丐版的MVC,可能还有一些不足,但是应该比较简单,希望有助于大家理解MVC
MVC 简析
上面就是效果图
下面直接上代码
首先呢是M层的,这里呢做了一个M层的接口

package com.example.administrator.mymvc.model;

import com.bwie.administrator.mymvc.callback.MyCallBack;

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

M层的实现类

package com.example.administrator.mymvc.model;

import android.os.Handler;
import android.os.Message;

import com.bwie.administrator.mymvc.callback.MyCallBack;
import com.bwie.administrator.mymvc.utils.MyHttpUtil;

import java.util.logging.LogRecord;

public class ModelImpl implements Model {
    public MyCallBack callback;
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0) {
                String data = (String) msg.obj;
                //进行判断
                if (callback != null) {
                    callback.success(data);
                }
            }
        }
    };

    @Override
    public void getData(final String url, final MyCallBack callBack) {
        //多态
        this.callback = callBack;
        //开启一个子线程  否则会运行在主线程中,然后变成耗时操作.阻塞主线程;
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    String data = MyHttpUtil.getStr(url);
                    handler.sendMessage(handler.obtainMessage(0,data));
                } catch (Exception e) {
                    callBack.error(e.getMessage() + "有异常,请求数据失败");
                }
            }
        }).start();
    }
}

这里写一个接口,进行回调,接口就是进行数据保存

package com.example.administrator.mymvc.callback;
public interface MyCallBack {
    //成功时添加数据
    void success(String data);
    //失败是回调
    void error(String error);
}

这里对Activity进行了一个基类抽取

package com.example.administrator.mymvc.base;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

public abstract class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        init();
    }
    //获取布局资源
    protected abstract int getLayout();
    //初始化控件
    protected abstract void initView();
    //注册监听
    protected abstract void setOnClick();
    //页面逻辑的处理
    protected abstract void processLogic();

    //定好方法的执行顺序流程
    void init() {
        //进行判断布局页面不能为空
        if (getLayout() != 0) {
            setContentView(getLayout());
            initView();
            setOnClick();
            processLogic();
        } else {
            throw new IllegalStateException("请加载布局页面");
        }
    }
}

解析的工具类,我就尽量的简单写一下

package com.example.administrator.mymvc.utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class MyHttpUtil {

    public static String getStr(String mUrl) {
        try {
            URL url = new URL(mUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            InputStream stream = connection.getInputStream();
            String jsons = getStream(stream);
            return jsons;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private static String getStream(InputStream stream) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
        StringBuffer sb = new StringBuffer();
        String con=null;
        while ((con = reader.readLine()) != null) {
            sb.append(con);
        }
        reader.close();
        return sb.toString();
    }
}

Activity的代码

package com.example.administrator.mymvc;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.bwie.administrator.mymvc.base.BaseActivity;
import com.bwie.administrator.mymvc.callback.MyCallBack;
import com.bwie.administrator.mymvc.model.ModelImpl;

public class MainActivity extends BaseActivity implements View.OnClickListener, MyCallBack {
    private Button Send_Btn;
    private TextView Get_Text;
    private ModelImpl mode;
    private String mUrl = "http://api.expoon.com/AppNews/getNewsList/type/1/p/1";

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

    //查找控件
    @Override
    protected void initView() {
        Send_Btn = findViewById(R.id.Send_Btn);
        Get_Text = findViewById(R.id.Get_Text);
    }

    @Override
    protected void setOnClick() {
        //进行事件监听
        Send_Btn.setOnClickListener(this);
    }

    @Override   
    protected void processLogic() {
        mode = new ModelImpl();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.Send_Btn:
                //通过匿名new出Callback写法不美观
                //所以我们实现了Callback 处理数据的回调接口
                //super和this
                //这个时候MainActivity 已经实现了Callback接口了说明MainActivity就是子类
                mode.getData(mUrl, this);
                break;
        }
    }

    //成功时回调
    @Override
    public void success(String data) {
        if (!data.isEmpty()) {
            Get_Text.setText(data);
        }
    }

    //失败时回调
    @Override
    public void error(String error) {
        Toast.makeText(this, error, Toast.LENGTH_SHORT).show();
    }
}

V层xml里面的代码,只写了一个简单的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    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/Send_Btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送" />

    <TextView
        android:id="@+id/Get_Text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="呵呵" />

</LinearLayout>

代码很简单,我自己的理解也就是M层就是moudle层,模型层,此处进行对数据的封装,以及操作,V层就是视图层,也就是对应xml的布局,C层也就是对于M+V层的操作,作为一个控制器,对应的就是Activity.个人的简单理解,如果有误,请指正.

相关文章: