传统的MVP:
1、抽离出View的接口,即ILoginView。
2、抽离Model的接口,即ILoginModel。
3、抽离Presenter的接口,即ILoginPresenter。
4、实现ILoginView 接口的 LoginActivity。
5、实现ILoginModel 接口的 LoginModel。
6、实现ILoginPresenter 接口的 LoginPresenter。
LoginActivity:实现ILoginView 接口以及初始化ILoginPresenter
public class LoginActivity extends BaseActivity implements ILoginView {
private ILoginPresenter mPresenter; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login); mPresenter = new LoginPresenter(this);
} public void onUserLogin(View view) { mPresenter.login(userName, password);
}
}
LoginPresenter:
public class LoginPresenter implements ILoginPresenter { private ILoginView mView;
private ILoginModel mModel; public LoginPresenter() {
init();
} public LoginPresenter(ILoginView view) {
mView = view;
init();
} private void init() {
mModel = new LoginModel(this);
}
}
下面改造后抽离后的MVP:
1、抽离出View的接口,即LoginView。
2、抽离Model的接口:使用rxjava 可以避免传入各种CallBack进行结果返回。
(1)网络层:LoginRepository。
(2)数据缓存层:LoginCache。
3、根据Model 层,抽离 Presenter层 :LoginPresenter。
4、实现LoginView 接口的 LoginActivity。
5、实现LoginRepository 接口的 LoginRepositoryImpl。
6、(如需要数据缓存,以及缓存操作的)实现LoginCache 接口的 LoginCacheImpl。
7、实现LoginPresenter 接口的 LoginPresenterImpl。
下面例子:
(1)用户界面输入用户名密码,点击登录按钮,出现进度条,进行接口请求.
(2)登陆成功,进度条消失,跳转.
(3)登陆失败,进度条消失,Toast失败原因
布局文件:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"tools:context=".MainActivity"> <EditText
android:layout_width="match_parent"
android:id="@+id/et_username"
android:hint="input user name"
android:layout_height="wrap_content" /> <EditText
android:layout_width="match_parent"
android:id="@+id/et_password"
android:hint="input user password"
android:layout_height="wrap_content" /> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onUserLogin"
android:text="登录"/> </LinearLayout>
View :
public interface LoginView { void showProgress(); void dismissProgress(); void onLoginFail(String error); void goToActivity();
}
Activity :
public class LoginActivity extends AppCompatActivity implements LoginView { private EditText userNameEdit;
private EditText pwdEdit;
private ProgressDialog dialog; private LoginPresenter presenter = new LoginPresenterImpl(this); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initViews();
} private void initViews() {
userNameEdit = (EditText) findViewById(R.id.tv_username);
pwdEdit = (EditText) findViewById(R.id.tv_password);
} public void onUserLogin(View v){
String userName = userNameEdit.getText().toString().trim(); String password = pwdEdit.getText().toString().trim();
presenter.login(userName, password);// 登录
} @Override
public void showProgress() {
if(dialog==null){
dialog = ProgressDialog.show(this,"","loading...");
}else{
if(!dialog.isShowing()){
dialog.show();
}
}
} @Override
public void dismissProgress() {
if(dialog!=null&&dialog.isShowing()){
dialog.dismiss();
}
} @Override
public void onLoginFail(final String error) {
// 提示登录失败
} @Override
public void goToActivity() {
// 登录成功跳转到其他页面
}
}
Model,网络层:
public interface LoginReposity {
// 在网络请求当中,可以一个模块一个Repository
// 在数据缓存当中,可以一个模块一个Cache
Observable<JSONObject> login(String userName,String password);
}
Model,网络层实现类:
public class LoginReposityImpl { public LoginRepositoryImpl(){} @Override
public Observable<JSONObject> login() {
return Observable.create(new Observable.OnSubscribe<JSONObject>() {
@Override
public void call(Subscriber<? super JSONObject> subscriber) {
// 模拟请求登录成功返回json数据
JSONObject json = new JSONObject();
subscriber.onNext(json);
subscriber.onCompleted();
}
});
}
}
Presenter:
public interface LoginPresenter { void login(String userName, String password);
}
presenter实现类:
public class LoginPresenterImpl implements LoginPresenter { private LoginRepository repository; private LoginView view; public LoginPresenterImpl(LoginView _view){
view = _view;
repository = new LoginRepositoryImpl();
} public void login(String userName, String password){ if(TextUtils.isEmpty(userName)||TextUtils.isEmpty(password)){
view.onLoginFail("请完善登录信息");
return;
}
view.showProgress();
repository.login(userName, password)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Boolean>() {
@Override
public void onCompleted() { } @Override
public void onError(Throwable e) {
view.dismissProgress();
view.onLoginFail(error.getMessage());
} @Override
public void onNext(Boolean aBoolean) {
view.dismissProgress();
view.goToActivity();
}
}));
}
}