详解MVC(乞丐版)

今天给大家带来的是乞丐版的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();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43747497/article/details/84797038