尝试着做了一个乞丐版的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.个人的简单理解,如果有误,请指正.