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

来源:互联网 发布:淘宝hd打开怎么变横屏 编辑:程序博客网 时间:2024/06/07 03:56

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

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

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

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

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


  

              


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


实现顺序:

首先界面搭建:

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对应的控件

@Overrideprotected 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 ,LoginListenerlistener);

此时,发现登录函数需要一个登录的监听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


0 0
原创粉丝点击