Android MVP 利用rxjava 避免向Model传入监听方法

it2022-05-06  5

传统的MVP:

1、抽离出View的接口,即ILoginView。

2、抽离Model的接口,即ILoginModel。

3、抽离Presenter的接口,即ILoginPresenter。

4、实现ILoginView 接口的 LoginActivity。

5、实现ILoginModel 接口的 LoginModel。

6、实现ILoginPresenter 接口的 LoginPresenter。

LoginActivity:实现ILoginView 接口以及初始化ILoginPresenter

1 public class LoginActivity extends BaseActivity implements ILoginView { 2 private ILoginPresenter mPresenter; 3 4 @Override 5 public void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.activity_login); 8 9 mPresenter = new LoginPresenter(this); 10 } 11 12 public void onUserLogin(View view) { 13 14 mPresenter.login(userName, password); 15 } 16 }

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失败原因

布局文件:

1 <LinearLayout 2 xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:orientation="vertical"tools:context=".MainActivity"> 7 8 <EditText 9 android:layout_width="match_parent" 10 android:id="@+id/et_username" 11 android:hint="input user name" 12 android:layout_height="wrap_content" /> 13 14 <EditText 15 android:layout_width="match_parent" 16 android:id="@+id/et_password" 17 android:hint="input user password" 18 android:layout_height="wrap_content" /> 19 20 <Button 21 android:layout_width="match_parent" 22 android:layout_height="wrap_content" 23 android:onClick="onUserLogin" 24 android:text="登录"/> 25 26 </LinearLayout>

View :

1 public interface LoginView { 2 3 void showProgress(); 4 5 void dismissProgress(); 6 7 void onLoginFail(String error); 8 9 void goToActivity(); 10 }

Activity :

1 public class LoginActivity extends AppCompatActivity implements LoginView { 2 3 private EditText userNameEdit; 4 private EditText pwdEdit; 5 private ProgressDialog dialog; 6 7 private LoginPresenter presenter = new LoginPresenterImpl(this); 8 9 @Override 10 protected void onCreate(Bundle savedInstanceState) { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.activity_login); 13 initViews(); 14 } 15 16 private void initViews() { 17 userNameEdit = (EditText) findViewById(R.id.tv_username); 18 pwdEdit = (EditText) findViewById(R.id.tv_password); 19 } 20 21 public void onUserLogin(View v){ 22 String userName = userNameEdit.getText().toString().trim(); 23 24 String password = pwdEdit.getText().toString().trim(); 25 presenter.login(userName, password);// 登录 26 } 27 28 @Override 29 public void showProgress() { 30 if(dialog==null){ 31 dialog = ProgressDialog.show(this,"","loading..."); 32 }else{ 33 if(!dialog.isShowing()){ 34 dialog.show(); 35 } 36 } 37 } 38 39 @Override 40 public void dismissProgress() { 41 if(dialog!=null&&dialog.isShowing()){ 42 dialog.dismiss(); 43 } 44 } 45 46 @Override 47 public void onLoginFail(final String error) { 48 // 提示登录失败 49 } 50 51 @Override 52 public void goToActivity() { 53 // 登录成功跳转到其他页面 54 } 55 }

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:

1 public interface LoginPresenter { 2 3 void login(String userName, String password); 4 }

presenter实现类:

1 public class LoginPresenterImpl implements LoginPresenter { 2 3 private LoginRepository repository; 4 5 private LoginView view; 6 7 public LoginPresenterImpl(LoginView _view){ 8 view = _view; 9 repository = new LoginRepositoryImpl(); 10 } 11 12 public void login(String userName, String password){ 13 14 if(TextUtils.isEmpty(userName)||TextUtils.isEmpty(password)){ 15 view.onLoginFail("请完善登录信息"); 16 return; 17 } 18 view.showProgress(); 19 repository.login(userName, password) 20 .subscribeOn(Schedulers.io()) 21 .observeOn(AndroidSchedulers.mainThread()) 22 .subscribe(new Subscriber<Boolean>() { 23 @Override 24 public void onCompleted() { 25 26 } 27 28 @Override 29 public void onError(Throwable e) { 30 view.dismissProgress(); 31 view.onLoginFail(error.getMessage()); 32 } 33 34 @Override 35 public void onNext(Boolean aBoolean) { 36 view.dismissProgress(); 37 view.goToActivity(); 38 } 39 })); 40 } 41 }

 

转载于:https://www.cnblogs.com/CharlesGrant/p/5051792.html


最新回复(0)