MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。其中M层处理数据,业务逻辑等;V层处理界面的显示结果;C层起到桥梁的作用,来控制V层和M层通信以此来达到分离视图显示和业务逻辑层。说了这么多,听着感觉很抽象,废话不多说,我们来看看MVC在Android开发中是怎么应用的吧!
我写的是一个网络请求数据MVC的写法来看一下具体代码
主题思想
- 新建BaseActivity抽取OnCreate的方法(加载布局,监听事件,初始化控件,页面逻辑处理这几个方法)
- 创建MyCallBack接口(接受请求数据反馈回来的几种状态)
- 创建Model接口(业务逻辑处理调用的方法)
- 创建ModelImpl(处理网络请求的一些方法)
- MainActivity继承继承BaseActivity中的抽象方法并实现MyCallBack接口
- 既然要做网络请求操作,那么权限就一定不要忘
- 还有依赖
好了思路就是这些下面展示代码
这是我分明的层次
首先是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