android Mvp模式

之前在做项目的时候,一直用的是mvc,但是在mvc模式中,有时候会在activity中写很多逻辑,导致activity看着很臃肿,这是因为model可以和view互交,现在我们来了解mvp模式。
首先我们看下mvc:
这里写图片描述
controller:相当于activity
view:相当于布局文件
model:处理逻辑与实体对象
我们在看下mvp:
这里写图片描述
view:相当于activity
presenter:是view和model之间的桥梁,负责数据的传递
modle:处理逻辑与实体对象

下面我们看个简单的mvp例子:
1.view:(Activity):

public class MainActivity extends AppCompatActivity implements InterfaceShow {
    private EditText name, pass;
    private InterfacePersent interfacePersentImpl;
    private CustomProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        name = (EditText) findViewById(R.id.name);
        pass = (EditText) findViewById(R.id.pass);
        progressDialog=new CustomProgressDialog(this, "");
    }

    public void LoginOnclick(View view){
        interfacePersentImpl=new InterfacePersentImpl();
        interfacePersentImpl.login(name.getText().toString(),pass.getText().toString(),this);
    }

    @Override
    public void showShow() {
        progressDialog.show();
    }

    @Override
    public void hideShow() {
        progressDialog.hide();
    }

    @Override
    public void successShow() {
        Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void failedShow(String string) {
        Toast.makeText(MainActivity.this, string, Toast.LENGTH_SHORT).show();
    }
}

2.persenert:

public interface InterfaceShow {
    public void showShow();
    public void hideShow();
    public void successShow();
    public void failedShow(String string);
}
public class InterfacePersentImpl implements InterfacePersent,MyListense{
    private Mode mode;
    private InterfaceShow interfaceShow;

    public InterfacePersentImpl() {
        mode = new ModeImpl(this);
    }

    @Override
    public void login(String name, String pass, InterfaceShow interfaceShow) {
        this.interfaceShow=interfaceShow;
        if (!name.equals("") && name != null && name.length() > 0 && !pass.equals("") && pass != null && pass.length() > 0) {
            mode.loginMode();
            interfaceShow.showShow();
        } else if(name.equals("") || name==null || name.length()==0){
            mode.loginFailedNameMode();
        }else if(pass.equals("") || pass==null || pass.length()==0){
            mode.loginFailedPassMode();
        }
    }

    @Override
    public void success() {
        interfaceShow.successShow();
        interfaceShow.hideShow();
    }

    @Override
    public void Failed(String string) {
        interfaceShow.failedShow(string);
        interfaceShow.hideShow();
    }
}
public interface InterfacePersent {
    public void login(String name,String pass,InterfaceShow interfaceShow);
}
public interface MyListense {
    public void success();
    public void Failed(String string);
}

3.model

public interface Mode {
    public void loginMode();
    public void loginFailedNameMode();
    public void loginFailedPassMode();

}
public class ModeImpl implements Mode {
   private MyListense myListense;
    public ModeImpl(MyListense myListense) {
        this.myListense=myListense;
    }

    @Override
    public void loginMode() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                myListense.success();
            }
        }, 3000);

    }

    @Override
    public void loginFailedNameMode() {
        myListense.Failed("用户名不能为空");
    }

    @Override
    public void loginFailedPassMode() {
        myListense.Failed("密码不能为空");
    }
}

最后是一个progress:

public class CustomProgressDialog extends Dialog {  
    public CustomProgressDialog(Context context, String strMessage) {  
//        this(context, R.style.CustomProgressDialog, strMessage);  
        this(context, R.style.dialog, strMessage);  
    }  

    public CustomProgressDialog(Context context, int theme, String strMessage) {  
        super(context, theme);  
        this.setContentView(R.layout.customprogressdialog);  
        this.getWindow().getAttributes().gravity = Gravity.CENTER; 
        this.setCanceledOnTouchOutside(false);
        TextView tvMsg = (TextView) this.findViewById(R.id.id_tv_loadingmsg);  
        if (tvMsg != null) {
            if(strMessage!=null && strMessage.length()>0){
                tvMsg.setVisibility(View.VISIBLE);
                tvMsg.setText(strMessage);
            }else{
                tvMsg.setVisibility(View.GONE);
            }

        }  
    }  

    @Override  
    public void onWindowFocusChanged(boolean hasFocus) {    
        if (!hasFocus) {  
            dismiss();  
        }  
    }  
}

R.style.dialog:

    <style name="dialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item><!--边框-->
        <item name="android:windowIsFloating">true</item><!--是否浮现在activity之上-->
        <item name="android:windowIsTranslucent">false</item><!--半透明-->
        <item name="android:windowNoTitle">true</item><!--无标题-->
        <item name="android:windowBackground">@android:color/transparent</item><!--背景透明   去掉背景色边框也就去掉了 -->
        <item name="android:backgroundDimEnabled">false</item><!--模糊-->
        <!-- <item name="android:windowContentOverlay">@null</item> -->

        <!-- android:backgroundDimAmount就是用来控制灰度的值,当为1时,界面除了我们的dialog内容是高亮显示的,dialog以外的区域是黑色的,完全看不到其他内容,系统的默认值是0.5,而已根据自己的需要调整 -->
        <item name="android:backgroundDimAmount">0.5</item>
    </style>

R.layout.customprogressdialog:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    android:padding="8dp" >

    <ProgressBar
        android:id="@+id/loadingImageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="15dp"
        android:indeterminateDrawable="@anim/progress_medium" />

    <TextView
        android:id="@+id/id_tv_loadingmsg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:textColor="@android:color/white"
        android:textSize="18dp" />

</LinearLayout>

anim:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/dialog"
    android:fromDegrees="0"
    android:pivotX="50.0%"
    android:pivotY="50.0%"
    android:toDegrees="360" />

@drawable/dialog图片随便找一个就行了
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值