今天给大家带来的是乞丐版的MVC,初学MVC,还请各位大佬多多指教,这是我从网上随便找的一篇博客,经过我的实验后,这段代码是可用的,也是最基础的MVC,理解起来还是比较简单的。
我是从网上获取一个数据展示在TextView上面。
这是效果图,有点丑,但只是测试MVC,不要在意细节:
首先我们先加一下网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
让后在写一个简单的布局,代码如下:
<?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:orientation="vertical"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="按钮"
android:id="@+id/btn1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="呵呵哒"
android:id="@+id/tv"/>
</LinearLayout>
Http工具类:
package com.example.app5.base.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;
import java.net.URLConnection;
public class HttpUtils {
public static String get(String urlStr)throws Exception
{
URL url=new URL(urlStr);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = urlConnection.getInputStream();
String str=getStr(inputStream);
return str;
}
private static String getStr(InputStream stream) throws IOException {
BufferedReader reader=new BufferedReader(new InputStreamReader(stream));
StringBuffer buffer=new StringBuffer();
String con=null;
while ((con=reader.readLine())!=null)
{
buffer.append(con);
}
return buffer.toString();
}
}
抽取的一个BaseActivity类:
package com.example.app5.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 initViews();
//注册监听
protected abstract void setOnclck();
//逻辑操作
protected abstract void processLogic();
void init() {
if(getLayout()!=0)
{
setContentView(getLayout());
initViews();
setOnclck();
processLogic();
}
else
{
//抛出一个非法异常
throw new IllegalStateException("请加载布局文件");
}
}
}
Model层的接口类:
package com.example.app5.model;
import com.example.app5.callback.MyCallBack;
//定义一个接口(一个规范,一个定义语言)
public interface Model {
//第一个参数是一个接口地址,第二个参数是定义的一个接口,用于回调保存数据
void getData(String url,MyCallBack callBack);
}
回调保存的接口:
package com.example.app5.callback;
public interface MyCallBack {
//成功请求调用,保存数据
void success(String data);
//失败后调用
void error(String error);
}
实现Model接口类:
package com.example.app5.model;
import android.os.Handler;
import android.os.Message;
import com.example.app5.base.utils.HttpUtils;
import com.example.app5.callback.MyCallBack;
public class ModelImpl implements Model{
//回滚保存的接口
private MyCallBack callBack;
private Handler mHandler=new Handler()
{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//接收子线程的传递过来的值,进行判断
if(msg.what==0)
{
//定义一个String,把子线程的值赋值给data
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=HttpUtils.get(url);
//更新主线程
mHandler.sendMessage(mHandler.obtainMessage(0,data));
}catch (Exception e)
{
//捕捉异常
//把其他线程的代码放到主线程里面操作的
Looper.prepare();
callBack.error(e.getMessage()+"异常");
//开始执行
Looper.loop();
}
}
}).start();
}
}
主页面的代码:
package com.example.app5;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.example.app5.base.BaseActivity;
import com.example.app5.callback.MyCallBack;
import com.example.app5.model.ModelImpl;
//继承自己定义的BaseActivity,实现方法
public class MainActivity extends BaseActivity implements View.OnClickListener,MyCallBack {
private Button btn1;
private TextView tv;
private ModelImpl model;
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 initViews() {
btn1 = (Button) findViewById(R.id.btn1);
tv = (TextView) findViewById(R.id.tv);
}
@Override
protected void setOnclck() {
btn1.setOnClickListener(this);
}
@Override
protected void processLogic() {
model=new ModelImpl();
}
@Override
public void onClick(View v) {
switch (v.getId())
{
case R.id.btn1:
//第一个参数是接口地址,这个this就是 new了一个MainActivity,但因为当前MainActivity实现了
MyCallBack,所以可以用里面的方法。
model.getData(mUrl,this);
break;
}
}
@Override
public void success(String data) {
if(!data.isEmpty())
{
tv.setText(data);
}
}
@Override
public void error(String error) {
Toast.makeText(this,error,Toast.LENGTH_SHORT).show();
}
}