鸿蒙 MVP+ Rxjava+Retrofit+okhttp 实现教程

2025-05-29 0 36

鸿蒙 MVP+ Rxjava+Retrofit+okhttp 实现教程

前言:

各位同学大家好,有段时间没有给大家更新文章 ,最近还在学习鸿蒙开发的支持,就想着把android里面部分用到知识搬到鸿蒙里面 因为基础语言都是java 语言,所以就写了现在这教程 那么废话不多说我们正式开始

##效果图

鸿蒙 MVP+ Rxjava+Retrofit+okhttp 实现教程

准备工作

1 安装鸿蒙开发环境 大家可以看我之前的文章

需要用到的三方库

  1. //okhttp3
  2. implementation'com.squareup.okhttp3:okhttp:4.2.0'
  3. implementation"com.squareup.okhttp3:logging-interceptor:3.10.0"
  4. //retrofit2
  5. implementation'com.squareup.retrofit2:retrofit:2.9.0'
  6. implementation'com.squareup.retrofit2:converter-gson:2.9.0'
  7. implementation'com.squareup.retrofit2:adapter-rxjava3:2.9.0'

请在build.gradle里面添加依赖然后sygn now 同步下载依赖

具体实现

MainAbility布局代码

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <DirectionalLayout
  3. xmlns:ohos="http://schemas.huawei.com/res/ohos"
  4. ohos:height="match_parent"
  5. ohos:width="match_parent"
  6. ohos:orientation="vertical">
  7. <Text
  8. ohos:id="$+id:text_fruit_tag"
  9. ohos:height="35vp"
  10. ohos:width="match_parent"
  11. ohos:background_element="$graphic:text_element"
  12. ohos:layout_alignment="left"
  13. ohos:text="账户"
  14. ohos:text_size="85"
  15. ohos:right_margin="20vp"
  16. ohos:left_margin="20vp"
  17. ohos:top_margin="25vp"
  18. ohos:text_color="#000000"
  19. />
  20. <TextField
  21. ohos:id="$+id:text_username"
  22. ohos:height="35vp"
  23. ohos:width="match_parent"
  24. ohos:background_element="$graphic:text_element"
  25. ohos:layout_alignment="left"
  26. ohos:text_size="50"
  27. ohos:right_margin="20vp"
  28. ohos:left_margin="20vp"
  29. ohos:text_color="#000000"
  30. ohos:top_margin="25vp"
  31. ohos:basement="#000099"
  32. ohos:hint="请输入账号"
  33. />
  34. <Text
  35. ohos:id="$+id:text_number_tag"
  36. ohos:height="35vp"
  37. ohos:width="match_parent"
  38. ohos:background_element="$graphic:text_element"
  39. ohos:layout_alignment="left"
  40. ohos:text="密码"
  41. ohos:text_size="85"
  42. ohos:right_margin="20vp"
  43. ohos:left_margin="20vp"
  44. ohos:text_color="#000000"
  45. ohos:top_margin="25vp"
  46. />
  47. <TextField
  48. ohos:id="$+id:text_password"
  49. ohos:height="35vp"
  50. ohos:width="match_parent"
  51. ohos:background_element="$graphic:text_element"
  52. ohos:layout_alignment="left"
  53. ohos:text_size="50"
  54. ohos:right_margin="20vp"
  55. ohos:left_margin="20vp"
  56. ohos:text_color="#000000"
  57. ohos:top_margin="25vp"
  58. ohos:basement="#000099"
  59. ohos:hint="请输入密码"
  60. />
  61. <Button
  62. ohos:id="$+id:login_btn"
  63. ohos:width="match_parent"
  64. ohos:height="50vp"
  65. ohos:text="登录"
  66. ohos:background_element="$graphic:button_element"
  67. ohos:text_size="50"
  68. ohos:text_color="#FFFFFF"
  69. ohos:top_margin="25vp"
  70. ohos:right_margin="20vp"
  71. ohos:left_margin="20vp"
  72. />
  73. </DirectionalLayout>

布局效果

鸿蒙 MVP+ Rxjava+Retrofit+okhttp 实现教程

我们的目的很明确 我们想拿到2个输入框的内容然后调用网络接口来实现登录的操作 业务非常简单

但是今天要用 MVP+ Rxjava+Retrofit+okhttp 来实现

网络核心部分

  1. packagecom.example.hmsrxjava_demo.net;
  2. importjava.io.IOException;
  3. importio.reactivex.rxjava3.annotations.NonNull;
  4. importohos.agp.render.render3d.BuildConfig;
  5. importokhttp3.Interceptor;
  6. importokhttp3.OkHttpClient;
  7. importokhttp3.Request;
  8. importokhttp3.Response;
  9. importokhttp3.logging.HttpLoggingInterceptor;
  10. importretrofit2.Retrofit;
  11. importretrofit2.adapter.rxjava3.RxJava3CallAdapterFactory;
  12. importretrofit2.converter.gson.GsonConverterFactory;
  13. /**
  14. *description:
  15. */
  16. publicclassRetrofitClient{
  17. privatestaticvolatileRetrofitClientinstance;
  18. privateAPIServiceapiService;
  19. privateStringbaseUrl="https://www.wanandroid.com";
  20. privateRetrofitretrofit;
  21. privateOkHttpClientokHttpClient;
  22. privateRetrofitClient(){
  23. }
  24. publicstaticRetrofitClientgetInstance(){
  25. if(instance==null){
  26. synchronized(RetrofitClient.class){
  27. if(instance==null){
  28. instance=newRetrofitClient();
  29. }
  30. }
  31. }
  32. returninstance;
  33. }
  34. /**
  35. *设置Header
  36. *
  37. *@return
  38. */
  39. privateInterceptorgetHeaderInterceptor(){
  40. returnnewInterceptor(){
  41. @Override
  42. publicResponseintercept(@NonNullChainchain)throwsIOException{
  43. Requestoriginal=chain.request();
  44. Request.BuilderrequestBuilder=original.newBuilder();
  45. //添加Token如果需要添加请求头可以统一在这里添加
  46. //Request.BuilderrequestBuilder=original.newBuilder().header("token","");
  47. Requestrequest=requestBuilder.build();
  48. returnchain.proceed(request);
  49. }
  50. };
  51. }
  52. /**
  53. *设置拦截器打印日志
  54. *
  55. *@return
  56. */
  57. privateInterceptorgetInterceptor(){
  58. HttpLoggingInterceptorinterceptor=newHttpLoggingInterceptor();
  59. //显示日志
  60. interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
  61. returninterceptor;
  62. }
  63. publicOkHttpClientgetOkHttpClient(){
  64. if(okHttpClient==null){
  65. //如果为DEBUG就打印日志
  66. if(BuildConfig.DEBUG){
  67. okHttpClient=newOkHttpClient().newBuilder()
  68. //设置Header
  69. .addInterceptor(getHeaderInterceptor())
  70. //设置拦截器
  71. .addInterceptor(getInterceptor())
  72. .build();
  73. }else{
  74. okHttpClient=newOkHttpClient().newBuilder()
  75. //设置Header
  76. .addInterceptor(getHeaderInterceptor())
  77. .build();
  78. }
  79. }
  80. returnokHttpClient;
  81. }
  82. publicAPIServicegetApi(){
  83. //初始化一个client,不然retrofit会自己默认添加一个
  84. if(retrofit==null){
  85. retrofit=newRetrofit.Builder()
  86. //设置网络请求的Url地址
  87. .baseUrl(baseUrl)
  88. //设置数据解析器
  89. .addConverterFactory(GsonConverterFactory.create())
  90. //设置网络请求适配器,使其支持RxJava与RxAndroid
  91. .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
  92. .client(getOkHttpClient())
  93. .build();
  94. }
  95. //创建——网络请求接口——实例
  96. if(apiService==null){
  97. apiService=retrofit.create(APIService.class);
  98. }
  99. returnapiService;
  100. }
  101. }

我们写了一个单例来获取 RetrofitClient 实力并且设置的了请求头 handler 和设置OKHTTP 日志拦截器

然后定义了 getApi 方法来获取 APIService 的实例

  • RxScheduler

RXjava 线程调度

  1. packagecom.example.hmsrxjava_demo.net;
  2. importcom.example.hmsrxjava_demo.HarmonySchedulers;
  3. importorg.reactivestreams.Publisher;
  4. importio.reactivex.rxjava3.core.Flowable;
  5. importio.reactivex.rxjava3.core.FlowableTransformer;
  6. importio.reactivex.rxjava3.core.Observable;
  7. importio.reactivex.rxjava3.core.ObservableSource;
  8. importio.reactivex.rxjava3.core.ObservableTransformer;
  9. importio.reactivex.rxjava3.schedulers.Schedulers;
  10. /**
  11. *description:RXjava线程调度
  12. */
  13. publicclassRxScheduler{
  14. /**
  15. *统一线程处理
  16. *
  17. *@param<T>指定的泛型类型
  18. *@returnFlowableTransformer
  19. */
  20. publicstatic<T>FlowableTransformer<T,T>Flo_io_main(){
  21. returnnewFlowableTransformer<T,T>(){
  22. @Override
  23. publicPublisher<T>apply(Flowable<T>upstream){
  24. returnupstream.subscribeOn(Schedulers.io())
  25. .observeOn(HarmonySchedulers.mainThread());
  26. }
  27. };
  28. }
  29. /**
  30. *统一线程处理
  31. *
  32. *@param<T>指定的泛型类型
  33. *@returnObservableTransformer*/
  34. publicstatic<T>ObservableTransformer<T,T>Obs_io_main(){
  35. returnnewObservableTransformer<T,T>(){
  36. @Override
  37. publicObservableSource<T>apply(Observable<T>upstream){
  38. returnupstream.subscribeOn(Schedulers.io())
  39. .observeOn(HarmonySchedulers.mainThread());
  40. }
  41. };
  42. }
  43. }

这里代码就参考了 安卓里面 部分没有的 HarmonySchedulers.mainThread() 参考了安卓里面的自己实现了一下

  • APIService

处理网络请求的接口 类 所有网络请求的都写在 APIService 写法和安卓的 Retrofitle类似

  1. packagecom.example.hmsrxjava_demo.net;
  2. importcom.example.hmsrxjava_demo.bean.BaseObjectBean;
  3. importcom.example.hmsrxjava_demo.bean.LoginBean;
  4. importio.reactivex.rxjava3.core.Observable;
  5. importretrofit2.http.Field;
  6. importretrofit2.http.FormUrlEncoded;
  7. importretrofit2.http.POST;
  8. /**
  9. *Description:
  10. */
  11. publicinterfaceAPIService{
  12. /**
  13. *登陆
  14. *
  15. *@paramusername账号
  16. *@parampassword密码
  17. *@return
  18. */
  19. @FormUrlEncoded
  20. @POST("user/login")
  21. Observable<BaseObjectBean<LoginBean>>login(@Field("username")Stringusername,
  22. @Field("password")Stringpassword);
  23. }

base类

  • BaseAbility
  1. packagecom.example.hmsrxjava_demo.base;
  2. importohos.aafwk.ability.Ability;
  3. importohos.aafwk.content.Intent;
  4. publicabstractclassBaseAbilityextendsAbility{
  5. @Override
  6. protectedvoidonStart(Intentintent){
  7. super.onStart(intent);
  8. super.setUIContent(getLayoutId());
  9. initView();
  10. }
  11. @Override
  12. protectedvoidonStop(){
  13. super.onStop();
  14. }
  15. /**
  16. *设置布局
  17. *
  18. *@return
  19. */
  20. publicabstractintgetLayoutId();
  21. /**
  22. *初始化视图
  23. */
  24. publicabstractvoidinitView();
  25. }
  • BaseMvpAbility
  1. packagecom.example.hmsrxjava_demo.base;
  2. importohos.aafwk.content.Intent;
  3. publicabstractclassBaseMvpAbility<TextendsBasePresenter>extendsBaseAbilityimplementsBaseView{
  4. protectedTmPresenter;
  5. @Override
  6. protectedvoidonStart(Intentintent){
  7. super.onStart(intent);
  8. }
  9. @Override
  10. protectedvoidonStop(){
  11. if(mPresenter!=null){
  12. mPresenter.detachView();
  13. }
  14. super.onStop();
  15. }
  16. }
  • BasePresenter
  1. packagecom.example.hmsrxjava_demo.base;
  2. /**
  3. *Description:
  4. */
  5. publicclassBasePresenter<VextendsBaseView>{
  6. protectedVmView;
  7. /**
  8. *绑定view,一般在初始化中调用该方法
  9. *
  10. *@paramviewview
  11. */
  12. publicvoidattachView(Vview){
  13. this.mView=view;
  14. }
  15. /**
  16. *解除绑定view,一般在onDestroy中调用
  17. */
  18. publicvoiddetachView(){
  19. this.mView=null;
  20. }
  21. /**
  22. *View是否绑定
  23. *
  24. *@return
  25. */
  26. publicbooleanisViewAttached(){
  27. returnmView!=null;
  28. }
  29. }
  • BaseView

  1. packagecom.example.hmsrxjava_demo.base;
  2. /**
  3. *Description:
  4. */
  5. publicinterfaceBaseView{
  6. /**
  7. *显示加载中
  8. */
  9. voidshowLoading();
  10. /**
  11. *隐藏加载
  12. */
  13. voidhideLoading();
  14. /**
  15. *数据获取失败
  16. *@paramerrMessage
  17. */
  18. voidonError(StringerrMessage);
  19. }
  • Model 层
  1. packagecom.example.hmsrxjava_demo.contract;
  2. importcom.example.hmsrxjava_demo.base.BaseView;
  3. importcom.example.hmsrxjava_demo.bean.BaseObjectBean;
  4. importcom.example.hmsrxjava_demo.bean.LoginBean;
  5. importio.reactivex.rxjava3.core.Observable;
  6. /**
  7. *Description:
  8. */
  9. publicinterfaceMainContract{
  10. interfaceModel{
  11. Observable<BaseObjectBean<LoginBean>>login(Stringusername,Stringpassword);
  12. }
  13. interfaceViewextendsBaseView{
  14. @Override
  15. voidshowLoading();
  16. @Override
  17. voidhideLoading();
  18. @Override
  19. voidonError(StringerrMessage);
  20. voidonSuccess(BaseObjectBean<LoginBean>bean);
  21. }
  22. interfacePresenter{
  23. /**
  24. *登陆
  25. *
  26. *@paramusername
  27. *@parampassword
  28. */
  29. voidlogin(Stringusername,Stringpassword);
  30. }
  31. }
  • ##model 实现层
  1. packagecom.example.hmsrxjava_demo.model;
  2. importcom.example.hmsrxjava_demo.bean.BaseObjectBean;
  3. importcom.example.hmsrxjava_demo.bean.LoginBean;
  4. importcom.example.hmsrxjava_demo.contract.MainContract;
  5. importcom.example.hmsrxjava_demo.net.RetrofitClient;
  6. importio.reactivex.rxjava3.core.Observable;
  7. /**
  8. *Description:
  9. */
  10. publicclassMainModelimplementsMainContract.Model{
  11. privatestaticfinalStringTAG="MainModel";
  12. @Override
  13. publicObservable<BaseObjectBean<LoginBean>>login(Stringusername,Stringpassword){
  14. System.out.println("MainModellogin被调用");
  15. returnRetrofitClient.getInstance().getApi().login(username,password);
  16. }
  17. }
  • Presenter层

  1. packagecom.example.hmsrxjava_demo.presenter;
  2. importcom.example.hmsrxjava_demo.base.BasePresenter;
  3. importcom.example.hmsrxjava_demo.bean.BaseObjectBean;
  4. importcom.example.hmsrxjava_demo.bean.LoginBean;
  5. importcom.example.hmsrxjava_demo.contract.MainContract;
  6. importcom.example.hmsrxjava_demo.model.MainModel;
  7. importcom.example.hmsrxjava_demo.net.RxScheduler;
  8. importio.reactivex.rxjava3.annotations.NonNull;
  9. importio.reactivex.rxjava3.core.Observer;
  10. importio.reactivex.rxjava3.disposables.Disposable;
  11. /**
  12. *Description:
  13. */
  14. publicclassMainPresenterextendsBasePresenter<MainContract.View>implementsMainContract.Presenter{
  15. privateMainContract.Modelmodel;
  16. publicMainPresenter(){
  17. model=newMainModel();
  18. }
  19. @Override
  20. publicvoidlogin(Stringusername,Stringpassword){
  21. //View是否绑定如果没有绑定,就不执行网络请求
  22. if(!isViewAttached()){
  23. return;
  24. }
  25. model.login(username,password)
  26. .compose(RxScheduler.Obs_io_main())
  27. .subscribe(newObserver<BaseObjectBean<LoginBean>>(){
  28. @Override
  29. publicvoidonSubscribe(@NonNullDisposabled){
  30. mView.showLoading();
  31. }
  32. @Override
  33. publicvoidonNext(@NonNullBaseObjectBean<LoginBean>loginBeanBaseObjectBean){
  34. mView.onSuccess(loginBeanBaseObjectBean);
  35. System.out.println("onNext—–>");
  36. }
  37. @Override
  38. publicvoidonError(@NonNullThrowablee){
  39. mView.onError(e.getMessage());
  40. mView.hideLoading();
  41. }
  42. @Override
  43. publicvoidonComplete(){
  44. mView.hideLoading();
  45. }
  46. });
  47. }
  48. }
  • MainAbility 中 具体调用

  1. packagecom.example.hmsrxjava_demo;
  2. importcom.example.hmsrxjava_demo.base.BaseMvpAbility;
  3. importcom.example.hmsrxjava_demo.bean.BaseObjectBean;
  4. importcom.example.hmsrxjava_demo.bean.LoginBean;
  5. importcom.example.hmsrxjava_demo.contract.MainContract;
  6. importcom.example.hmsrxjava_demo.presenter.MainPresenter;
  7. importohos.agp.components.Button;
  8. importohos.agp.components.Component;
  9. importohos.agp.components.TextField;
  10. importohos.agp.window.dialog.ToastDialog;
  11. publicclassMainAbilityextendsBaseMvpAbility<MainPresenter>implementsMainContract.View{
  12. privateTextFieldtextUsername,textpasswrod;
  13. privateStringusername,password;
  14. privateButtonloginBtn;
  15. privateMainPresenterpresenter;
  16. @Override
  17. publicintgetLayoutId(){
  18. returnResourceTable.Layout_ability_main;
  19. }
  20. @Override
  21. publicvoidinitView(){
  22. textUsername=(TextField)findComponentById(ResourceTable.Id_text_username);
  23. textpasswrod=(TextField)findComponentById(ResourceTable.Id_text_password);
  24. presenter=newMainPresenter();
  25. presenter.attachView(this);
  26. loginBtn=(Button)findComponentById(ResourceTable.Id_login_btn);
  27. if(loginBtn!=null){
  28. loginBtn.setClickedListener(newComponent.ClickedListener(){
  29. @Override
  30. publicvoidonClick(Componentcomponent){
  31. System.out.println("点击登录按钮");
  32. username=textUsername.getText();
  33. password=textpasswrod.getText();
  34. if(username!=null&&password!=null){
  35. presenter.login(username,password);
  36. //login(username,password);
  37. }else{
  38. newToastDialog(MainAbility.this).setText("账号密码不输不能为空").show();}
  39. }
  40. });
  41. }
  42. }
  43. @Override
  44. publicvoidonSuccess(BaseObjectBean<LoginBean>bean){
  45. System.out.println(bean.getErrorCode()+bean.getErrorMsg());
  46. newToastDialog(MainAbility.this).setText(bean.getErrorCode()+bean.getErrorMsg()).show();
  47. }
  48. @Override
  49. publicvoidshowLoading(){
  50. }
  51. @Override
  52. publicvoidhideLoading(){
  53. }
  54. @Override
  55. publicvoidonError(StringerrMessage){
  56. }
  57. }

到此 鸿蒙 MVP+ Rxjava+Retrofit+okhttp 实现教程 使用起来和安卓的用法非常像 我这里很多代码是复制过来 同学们可以下载完整的代码来尝试。

最后总结:

鸿蒙中MVP+ Rxjava+Retrofit+okhttp 和安卓里面基本如出一辙 只是很少地方有些诧异,同学们如果不是很熟悉 Rxjava+Retrofit+okhttp 请先去看看官方教程 还有mvp模式的不熟悉的请切翻阅我之前的文章 。

原文链接:https://harmonyos.51cto.com

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 鸿蒙 MVP+ Rxjava+Retrofit+okhttp 实现教程 https://www.kuaiidc.com/90646.html

相关文章

发表评论
暂无评论