最近有一次看了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对应的控件
@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