Android MVP 在项目中的使用 以及demo

最近有一次看了Android mvp ,本文针对初始接触mvp,不习惯或是不知道如何使用的朋友

参考博客(这篇博客对mvp进行了细致的剖析): 

http://blog.csdn.net/lmj623565791/article/details/46596109; 
本文出自:【张鸿洋的博客】

  我就不在详细的讲解mvp的思想,直说用法了。

以界面登录为例子:(实现如下界面)


Android MVP 在项目中的使用 以及demo_第1张图片  

              


mvp设计模式,一个模块中需要在activity(或是fragment) 和 bean ,对于mvp,需要增加view层,biz业务层和管理这presenter,如图:

Android MVP 在项目中的使用 以及demo_第2张图片

实现顺序:

首先界面搭建:

1,建立一个空的activity:(我的名字MainActivity.java)

在xml文件中,代码如下:

xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.zzcz.fei.mymvp.MainActivity">

    <LinearLayout
        android:layout_above="@+id/progressBar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            >
            <TextView
                android:text="username:"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/textView" />
            <EditText
                android:id="@+id/username"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="#aaaaaa"
                />
        LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_marginTop="30dp"
            >
            <TextView
                android:text="password:"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/textView2" />
            <EditText
                android:id="@+id/password"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="#aaaaaa"/>
        LinearLayout>
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            >
           <LinearLayout
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:layout_centerInParent="true"
               >
               <Button
                   android:id="@+id/login"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:text="Login"
                   />
               <Button
                   android:id="@+id/clear"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:text="Clear"
                   />
           LinearLayout>
        RelativeLayout>


    LinearLayout>

    <ProgressBar
        style="?android:attr/progressBarStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:id="@+id/progressBar"
        android:visibility="invisible"
        />
RelativeLayout>
2.在MainActivity中声明并找到需要使用的控件:

声明:

private EditText usename;
private EditText password;
private Button login;
private Button clear;
private ProgressBar progressBar;

在onCreate中找到相应id对应的控件

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

    usename = (EditText) findViewById(R.id.username);
    password = (EditText) findViewById(R.id.password);

    login = (Button) findViewById(R.id.login);
    clear = (Button) findViewById(R.id.clear);
    progressBar = (ProgressBar) findViewById(R.id.progressBar);

    login.setOnClickListener(this);
    clear.setOnClickListener(this);
}
接下来开始使用mvp。可以根据需求来使用。

a.在MainActivity.java中声明一个你的管理者(presenter)

private MainPresenter presenter ;

创建一个名字为MainPresenter.java的Java类在包名为presener的包里。

b.在MainPresenter.java中声明一个名为MainView的管理者(view层)

private MainView mainView;

创建一个名字为MianView的接口

c创建务层,界面需要登陆需要使用 用户名和密码 (String username;String  password)。

那么,先创建登录的接口IUserlogin 以及登陆的函数:

public void login(String username,String password ,LoginListener listener);

此时,发现登录函数需要一个登录的监听listener,创建LoginListener的接口,分析登录两种状态:成功或是失败,成功返回用户信息,失败返回为空

接下来创建用户的实体类UserBean,代码如下:

private String username ;
private String password;

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}
在LoginListener中,补充登录请求的两种监听,代码如下:

void LoginOnFailed();
void LoginOnSucess(UserBean userBean);
最后完成登录业务层的实体类,创建 UserLoginIMPL的实体类,实现登录 IUserLogin登录的接口:

代码如下:


public class UserLoginIMPL implements IUserLogin{

    @Override
    public void login(final String username, final String password, final UserListener userListener) {

        //网络请求
        new Thread(){
            @Override
            public void run() {
                super.run();
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (username.equals("fei")&& password.equals("123")){
                    UserBean bean = new UserBean();
                    bean.setUsername(username);
                    bean.setPassword(password);
                    userListener.LoginOnSucess(bean);
                }else {
                    userListener.LoginOnFailed();
                }
            }

        }.start();

    }
}
以上业务层创建完成

d回到MainPresenter声明业务层的登录接口,

private UserLoginIMPL userLoginIMPL;
使用view层的 MainView创造构造函数

public MainPresenter(MainView mainView) {
    this.mainView = mainView;
    this.userLoginIMPL = new UserLoginIMPL();
}
e根据需要实现登录和清空数据:

登录:

在MainPresenter中声明并实现登录方法 

public void login(){

}

清空数据:

public void clear(){


}

f. 对于登录,需要展示蒙版,取消蒙版,以及请求登录,请求登录需要用户名称,用户密码,和返回成功,返回失败

在MianView中声明如下函数方法名称:

void showPrograss();
void showdismiss();

String getUsername();
String getPassword();
void toMainforFailed();
void toMainforScucss(UserBean userBean);

在MainPresenter中,登录后,需要返回主线程

声明:

import android.os.Handler;

private Handler handler = new Handler();

完成MainPresenter的登录:

public void login(){
    mainView.showPrograss();
    userLoginIMPL.login(mainView.getUsername(), mainView.getPassword(), new UserListener() {
        @Override
        public void LoginOnFailed() {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    mainView.showdismiss();
                    mainView.toMainforFailed();
                }
            });
        }

        @Override
        public void LoginOnSucess(final UserBean userBean) {

            handler.post(new Runnable() {
                @Override
                public void run() {
                    mainView.showdismiss();
                    mainView.toMainforScucss(userBean);
                }
            });
        }
    });
}

e.对于清空数据

实现同上,现在MainView中:


void clearusername();
void clearpassword();


再在MainPresenter中:

public void clear(){
    mainView.clearusername();
    mainView.clearpassword();
}

最后,在MainActivity中实现MainView,代码如下:

public class MainActivity extends AppCompatActivity implements View.OnClickListener ,MainView {

    private EditText usename;
    private EditText password;
    private Button login;
    private Button clear;
    private ProgressBar progressBar;
    private MainPresenter presenter = new MainPresenter(this);

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

        usename = (EditText) findViewById(R.id.username);
        password = (EditText) findViewById(R.id.password);

        login = (Button) findViewById(R.id.login);
        clear = (Button) findViewById(R.id.clear);
        progressBar = (ProgressBar) findViewById(R.id.progressBar);

        login.setOnClickListener(this);
        clear.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.login:
                presenter.login();
                break;
            case R.id.clear:
                presenter.clear();
                break;
            default:
                break;
        }
    }

    @Override
    public String getUsername() {
        return usename.getText().toString();
    }

    @Override
    public String getPassword() {
        return password.getText().toString();
    }

    @Override
    public void toMainforFailed() {
        Toast.makeText(this,"faile",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void toMainforScucss(UserBean userBean) {
        Toast.makeText(this,"sucess "+ userBean.getUsername(),Toast.LENGTH_SHORT).show();

    }

    @Override
    public void showPrograss() {

        progressBar.setVisibility(View.VISIBLE);
    }

    @Override
    public void showdismiss() {
        progressBar.setVisibility(View.INVISIBLE);

    }

    @Override
    public void clearusername() {

        usename.setText("");
    }

    @Override
    public void clearpassword() {
        password.setText("");
    }
}
注意,一定要写按钮的点击事件。

login.setOnClickListener(this);
clear.setOnClickListener(this);


愿意看一下demo的朋友可以从这里下载:

http://download.csdn.net/detail/flytosky_l/9738733


你可能感兴趣的:(android,笔记)