绝对新手的android MVP模式入门小记(一)

啥是mvp模式

其实我也不知道 ,去网上找俩小例子试试,看看代码是咋样的把

敲(抄)代码 环节

此处省略配环境骂*的一万句话,到后来还是不找复杂的找小的 新的 ------来自19年5月


登录用mvp模式来写

先看代码目录
在这里插入图片描述
然后就是效果图
在这里插入图片描述

详细代码

BasePresenter

package com.example.liuwangshu.mvp_simple;

public interface BasePresenter {
    void attachView(BaseView v);//绑定View

    void detachView();//分离View

    void login(User user);//登录逻辑
}


BaseView

package com.example.liuwangshu.mvp_simple;

public interface BaseView {

    void showToast(String msg);//弹一个吐司

    void loginSuccess(String msg);//登陆成功

    void loginFail(String msg);//登录失败

}

MainActivity

package com.example.liuwangshu.mvp_simple;
package com.example.liuwangshu.mvp_simple;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements BaseView {
    private Button btn;
    private EditText name,pwd;
    private MainPresenterImpl mPresenter;//定义业务逻辑;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mPresenter = new MainPresenterImpl();
        mPresenter.attachView(this);//初始化;
        btn = findViewById(R.id._btn);
        name = findViewById(R.id.name);
        pwd = findViewById(R.id.psw);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                User user = new User(name.getText().toString().trim(),pwd.getText().toString().trim());
                mPresenter.login(user);//实现需要的业务逻辑;
            }
        });

    }

    @Override
    public void showToast(String msg) {
        Toast.makeText(this,msg,Toast.LENGTH_LONG).show();
    }

    @Override
    public void loginSuccess(String msg) {
        showToast(msg);

    }

    @Override
    public void loginFail(String msg) {
        showToast(msg);
    }
}


MainPresenterImpl

package com.example.liuwangshu.mvp_simple;

import android.text.TextUtils;

public class MainPresenterImpl implements BasePresenter{
    private BaseView mBaseView;

    @Override
    public void attachView(BaseView v) {
        this.mBaseView = v;
    }

    @Override
    public void detachView() {
        mBaseView = null ;
    }

    /**
     *
     * 登录的逻辑
     * @param user
     */
    @Override
    public void login(User user) {
        if (!TextUtils.isEmpty(user.getName())&&!TextUtils.isEmpty(user.getPwd())){
            if (user.getName().equals("123")&&user.getPwd().equals("123")){
                mBaseView.loginSuccess("登陆成功");
            }else {
                mBaseView.loginFail("登录失败");
            }
        }else{
            mBaseView.showToast("用户名或者密码不能为空");
        }
    }

}



User

package com.example.liuwangshu.mvp_simple;

public class User {

    private String name;
    private String pwd;

    public User(String name, String pwd) {
        this.name = name;
        this.pwd = pwd;
    }

    public String getName() {
        return name;
    }

    public String getPwd() {
        return pwd;
    }

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

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}

布局文件当然得有 最恨不给布局文件的人 非得让我们自己手敲才爽
activity_main.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"
    tools:context=".MainActivity"
    android:orientation="vertical">

   <Button
       android:id="@+id/_btn"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="test" />
    <EditText
        android:id="@+id/name"
        android:hint="123"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <EditText
        android:id="@+id/psw"
        android:hint="123"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

看到这网上所说的那三个层次去哪了 咋分?

那就加点目录结构吧

在这里插入图片描述
这是一个新鲜的例子模仿获取天气情况 mainActivity文件在view文件夹下所以记得改下曼妮乏斯特文件。
在这里插入图片描述
效果图

具体代码实现

IWetherImpl

package com.example.liuwangshu.acer.mvpdome.model;

public class IWetherImpl implements IWetherModel {
    private String info;
    @Override
    public String getInfo() {
        return info;
    }

    @Override
    public void setInfo(String info) {
        this.info = info;
    }
}

IWetherModel

package com.example.liuwangshu.acer.mvpdome.model;

public interface IWetherModel {

//提供数据

    public String getInfo();

//存储数据

    public void setInfo(String info);

}

WetherPresenter

package com.example.liuwangshu.acer.mvpdome.presenter;

import com.example.liuwangshu.acer.mvpdome.model.IWetherImpl;
import com.example.liuwangshu.acer.mvpdome.model.IWetherModel;
import com.example.liuwangshu.acer.mvpdome.view.IWetherView;

public class WetherPresenter {
    IWetherModel mModel;
    IWetherView mView;

    因为Presenter持有View的引用,所以在这里要将View.interface注入到Presenter当中。
    public WetherPresenter(IWetherView mView) {
        this.mView = mView;
        mModel = new IWetherImpl();
    }//供View层调用,用来请求天气数据   

    public void requestWetherInfo() {
        getNetworkInfo();
    }

    private void getNetworkInfo() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {//打开等待对话框               
                    showWaitingDialog();//模拟网络耗时               
                    Thread.sleep(6000);
                    String info = "21度,晴转多云";
                    //保存到Model层               
                    saveInfo(info);//从Model层获取数据,为了演示效果,实际开发中根据情况需要。                 
                    String localinfo = localInfo();//通知View层改变视图               
                    updateWetherInfo(localinfo);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }//取消对话框               
                dissmissWaitingDialog();
            }
        }).start();
    }

    private void showWaitingDialog() {
        if (mView != null) {
            mView.showWaitingDialog();
        }
    }

    private void dissmissWaitingDialog() {
        if (mView != null) {
            mView.dissmissWaitingDialog();
        }
    }

    private void updateWetherInfo(String info) {
        if (mView != null) {
            mView.onInfoUpdate(info);
        }
    }

    private String localInfo() {
        return mModel.getInfo();
    }

    private void saveInfo(String info) {
        mModel.setInfo(info);
    }
}

IWetherView

package com.example.liuwangshu.acer.mvpdome.view;

public interface IWetherView {

    public void showWaitingDialog();

    public void dissmissWaitingDialog();

    public void onInfoUpdate(String info);
}

MainActivity

package com.example.liuwangshu.acer.mvpdome.view;

import android.app.ProgressDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.example.liuwangshu.acer.mvpdome.R;
import com.example.liuwangshu.acer.mvpdome.presenter.WetherPresenter;

public class MainActivity extends AppCompatActivity implements IWetherView {
    WetherPresenter mPresenter;
    private TextView mTvInfo;
    private Button mbtn;
    private ProgressDialog mDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mPresenter = new WetherPresenter(this);
        mbtn = findViewById(R.id.mbtn);
        mTvInfo = findViewById(R.id.mTvInfo);
        mbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mPresenter.requestWetherInfo();
            }
        });
    }

    @Override
    public void showWaitingDialog() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (mDialog != null && mDialog.isShowing()) {
                    mDialog.dismiss();
                }
                mDialog = ProgressDialog.show(MainActivity.this, "", "正在获取中...");
            }
        });
    }

    @Override
    public void dissmissWaitingDialog() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (mDialog != null && mDialog.isShowing()) {
                    mDialog.dismiss();
                }
            }
        });
    }

    @Override
    public void onInfoUpdate(final String info) {
        Log.d("-------------", "onInfoUpdate: " + info);
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mTvInfo.setText(info);
            }
        });
    }
}



布局文件 main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:text="sdhasgajs"
        android:id="@+id/mbtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <TextView
        android:text="sdasgyd uayguyg"
        android:id="@+id/mTvInfo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

接下来我们看点复杂点的例子

我其实也不会。。。。。。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值