Android架构模式——mvc

android荒废有段时间了,空闲之余,突然想复习下之前的知识,同时研究下最近流行的一些框架!首先先复习下架构模式吧!android现在用到的架构模式主要有三种:mvc,mvp,mvvm,先从mvc说起。

1.Model:模型层,负责处理数据的加载或者存储
2.View:视图层,负责界面数据的展示,与用户进行交互
3.Controller:控制器层,负责逻辑业务的处理

在刚学android那会,我们会将activity看做controller,把layout看成view,将网络请求及数据实体类看做Model。随着项目越来越庞大,你会发现activity干的事越来越多,一不留神就几百几千行代码,十分不利维护。其实这个时候,你的activity即干着controller的事,又干着view的事!!我们试着改造下项目:

  1. 新建个android项目
    在这里插入图片描述
    2.InforBean中存放数据实体
public class InforBean {
    String code;
    String name;
    String age;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

3.Model类使用retrofit请求网络数据

 public  static  void getParm(String url,String id,final onResultCallBack callBack){
        // 创建OkHttpClient.Builder对象
        OkHttpClient.Builder builder = new OkHttpClient().newBuilder() ;
        // 设置拦截器
        builder.addInterceptor(new Interceptor() {
            @Override
            public okhttp3.Response intercept(Chain chain) throws IOException {
                // 设置Header
                Request newRequest = chain.request().newBuilder()
                        .removeHeader("User-Agent")
                        .addHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36")
                        .build() ;
                return chain.proceed(newRequest);
            }
        }) ;
        OkHttpClient client = builder.build();

        Retrofit retrofit = new Retrofit.Builder()
                .client(client)
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        MyService service = retrofit.create(MyService.class);

        service.getInfor(id).enqueue(new Callback<InforBean>() {
            @Override
            public void onResponse(Call<InforBean> call, Response<InforBean> response) {
                InforBean inforBean = response.body();
                if (inforBean.getCode().equals("200")) {
                    Log.e("msg", "成功");
                    callBack.onResult(inforBean.getName()+":"+inforBean.getAge());
                } else {
                    Log.e("msg", "失败");
                    callBack.onResult("失败");
                }

            }
            @Override
            public void onFailure(Call<InforBean> call, Throwable t) {
                t.getStackTrace();
                System.out.print("baocuo=======:"+t.toString());
                Log.e("msg", "连接失败");
                callBack.onResult("连接失败");
            }
        });

    }

    public interface onResultCallBack {
        void onResult(String result);
    }

}

4.MyService定义get请求

public interface MyService {

    @GET("/test")
    Call<InforBean> getInfor(@Query("id") String id);

}

5.main_activity.xml中布局很简单,一个button一个textview

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:gravity="center">
<Button
    android:layout_marginTop="20dp"
    android:layout_width="200dp"
    android:layout_height="50dp"
    android:id="@+id/bt"
    android:text="点击"
    android:background="#fff"
    />
    <TextView
        android:layout_marginTop="50dp"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:id="@+id/tv"
        />
</LinearLayout>
下面重点在MainActivity和MyView,我们实现一个小功能,打开app时请求id=1的数据在textview中显示,点击按钮请求id=2的数据更新到textview中,通常情况下我们是这样建立MainActivity:
public class MainActivity extends AppCompatActivity implements Model.onResultCallBack,View.OnClickListener{

    String url="http://xxxxx";

    TextView tv;
    Button bt;
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_avtivity);

        tv=(TextView) findViewById(R.id.tv);
        bt=(Button)findViewById(R.id.bt);
        bt.setOnClickListener(this);
        initData();
    }
    private void initData(){

        String id="1";
        Model.getParm(url,id,this);
    }

    @Override
    public void onResult(String result) {
        tv.setText(result);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.bt:
                String id="2";
                Model.getParm(url,id,this);
            break;
            default:
                break;
        }
    }
}

现在来改造MainActivity,将view相关部分提取到MyView中

public class MyView implements Model.onResultCallBack,View.OnClickListener{

    TextView tv;
    Button bt;
    Activity activity;
    MyOnclick callback;
    public MyView(Activity activity,MyOnclick callback){
        this.activity=activity;
        this.callback=callback;
        initView(activity);
    }
    private void initView(Activity activity){
        tv=(TextView) activity.findViewById(R.id.tv);
        bt=(Button)activity.findViewById(R.id.bt);
        bt.setOnClickListener(this);
    }
    @Override
    public void onResult(String result) {
        tv.setText(result);
    }

    @Override
    public void onClick(View view) {
        callback.MyOnclick(view);
    }
    public interface MyOnclick{
        void MyOnclick(View view);
    }
    
}

新的MainActivity就很简洁了

public class MainActivity extends AppCompatActivity implements MyView.MyOnclick{
    MyView myView;
    String url="http://xxxxx";
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_avtivity);

        myView=new MyView(this,this);
        initData();
    }
    private void initData(){

        String id="1";
        Model.getParm(url,id,myView);
    }

    @Override
    public void MyOnclick(View view) {

        String id="2";
        Model.getParm(url,id,myView);
    }
}

结语:项目改造后更便于理解mvc架构模式,controller,model和,view三者的分工更清晰,有利于后期扩展维护!!

下一篇:Android架构模式——mvp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值