CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết blog CFSDN này Hướng dẫn triển khai Hongmeng MVP+ Rxjava+Retrofit+okhttp được tác giả sưu tầm và biên soạn. Nếu các bạn quan tâm đến bài viết này thì nhớ like nhé.

Lời nói đầu:
Xin chào các bạn sinh viên, đã lâu tôi chưa cập nhật bài viết cho các bạn. Gần đây tôi vẫn đang tìm hiểu về sự hỗ trợ phát triển của Hongmeng và tôi muốn chuyển một số kiến thức được sử dụng trong Android sang Hongmeng. ngôn ngữ này, tôi đã viết nó ngay bây giờ. Không cần phải dài dòng nữa trong hướng dẫn này, hãy bắt đầu.
##Kết xuất
Sự chuẩn bị
1. Để cài đặt môi trường phát triển Hongmeng, bạn có thể đọc bài viết trước của tôi.
Cần có thư viện của bên thứ ba
- //Được rồihttp3
- thực hiện 'com.squareup.okhttp3:okhttp:4.2.0'
- thực hiện "com.squareup.okhttp3:logging-interceptor:3.10.0"
- //cải tiến2
- thực hiện 'com.squareup.retrofit2:retrofit:2.9.0'
- thực hiện 'com.squareup.retrofit2:converter-gson:2.9.0'
- thực hiện 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'
Vui lòng thêm các phần phụ thuộc vào build.gradle, sau đó sử dụng sygn ngay để tải xuống các phần phụ thuộc một cách đồng bộ.
Triển khai cụ thể
Mã bố cục MainAbility.
- "1.0" mã hóa="utf-8"?>
-
- xmlns:ohos="http://schemas.huawei.com/res/ohos"
- ohos:chiều cao="phù hợp với cha mẹ"
- ohos:chiều rộng="phù hợp với cha mẹ"
- ohos: định hướng="thẳng đứng">
-
-
- Ồ, vâng:id="$+id:text_fruit_tag"
- ohos:chiều cao="35vp"
- ohos:chiều rộng="phù hợp với cha mẹ"
- ohos:phần_tử_nền="$graphic: phần tử văn bản"
- ohos:layout_alignment="bên trái"
- ohos:text="tài khoản"
- ohos:text_size="85"
- ohos:right_margin="20vp"
- ohos:left_margin="20vp"
- ohos:top_margin="25vp"
- ohos:text_color="#000000"
- />
-
-
|
- Ồ, vâng:id="$+id:text_username"
- ohos:chiều cao="35vp"
- ohos:chiều rộng="phù hợp với cha mẹ"
- ohos:phần_tử_nền="$graphic: phần tử văn bản"
- ohos:layout_alignment="bên trái"
- ohos:text_size="50"
- ohos:right_margin="20vp"
- ohos:left_margin="20vp"
- ohos:text_color="#000000"
- ohos:top_margin="25vp"
- ohos: tầng hầm="#000099"
- ohos:gợi ý="Xin vui lòng nhập số tài khoản của bạn"
- />
-
-
- Ồ, vâng:id="$+id:text_number_tag"
- ohos:chiều cao="35vp"
- ohos:chiều rộng="phù hợp với cha mẹ"
- ohos:phần_tử_nền="$graphic: phần tử văn bản"
- ohos:layout_alignment="bên trái"
- ohos:text="mật khẩu"
- ohos:text_size="85"
- ohos:right_margin="20vp"
- ohos:left_margin="20vp"
- ohos:text_color="#000000"
- ohos:top_margin="25vp"
- />
-
-
|
- Ồ, vâng:id="$+id:text_password"
- ohos:chiều cao="35vp"
- ohos:chiều rộng="phù hợp với cha mẹ"
- ohos:phần_tử_nền="$graphic: phần tử văn bản"
- ohos:layout_alignment="bên trái"
- ohos:text_size="50"
- ohos:right_margin="20vp"
- ohos:left_margin="20vp"
- ohos:text_color="#000000"
- ohos:top_margin="25vp"
- ohos: tầng hầm="#000099"
- ohos:gợi ý="Xin vui lòng nhập mật khẩu"
- />
- <>
- Ồ, vâng:id="$+id:login_btn"
- ohos:chiều rộng="phù hợp với cha mẹ"
- ohos:chiều cao="50vp"
- ohos:text="Đăng nhập"
- ohos:phần_tử_nền="$graphic:button_element"
- ohos:text_size="50"
- ohos:text_color="#FFFFFF"
- ohos:top_margin="25vp"
- ohos:right_margin="20vp"
- ohos:left_margin="20vp"
- />
-
Hiệu ứng bố cục
Mục đích của chúng tôi rất rõ ràng. Chúng tôi muốn lấy nội dung của hai hộp đầu vào và sau đó gọi giao diện mạng để thực hiện thao tác đăng nhập rất đơn giản.
Nhưng hôm nay chúng ta sẽ sử dụng MVP+ Rxjava+Retrofit+okhttp để đạt được điều đó.
phần cốt lõi của mạng
- Đóng gói lớp RetrofitClient
- gói com.example.hmsrxjava_demo.net;
- nhập java.io.IOException;
-
- nhập io.reactivex.rxjava3.annotations.NonNull;
- nhập ohos.agp.render.render3d.BuildConfig;
- nhập okhttp3.Interceptor;
- nhập okhttp3.OkHttpClient;
- nhập okhttp3.Request;
- nhập okhttp3.Response;
- nhập okhttp3.logging.HttpLoggingInterceptor;
- nhập khẩu retrofit2.Retrofit;
- nhập retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory;
- nhập retrofit2.converter.gson.GsonConverterFactory;
-
- /**
- * Sự miêu tả:
- */
- công cộng lớp RetrofitClient {
-
- riêng tư tĩnh thể hiện RetrofitClient dễ bay hơi;
- APIService riêng tư apiService;
- riêng tư String baseUrl = "https://www.wanandroid.com";
- cải tạo riêng tư cải tạo;
- riêng tư OkHttpClient okHttpClient;
-
- riêng tư RetrofitClient() {
- }
-
- công cộng tĩnh RetrofitClient lấyInstance() {
- nếu (ví dụ == vô giá trị) {
- đồng bộ (RetrofitClient.class) {
- nếu (ví dụ == vô giá trị) {
- thể hiện = RetrofitClient mới();
- }
- }
- }
- trở lại ví dụ;
- }
-
- /**
- * Đặt tiêu đề
- *
- * @trở lại
- */
- riêng tư Interceptor getHeaderInterceptor() {
- trở lại Interceptor mới() {
- @Ghi đè
- công cộng Phản hồi chặn(@NonNull Chain chain) ném IOException {
- Yêu cầu gốc = chain.request();
- Yêu cầu.Builder requestBuilder = original.newBuilder();
- //Thêm mã thông báo Nếu bạn cần thêm tiêu đề yêu cầu, bạn có thể thêm chúng ở đây.
- // Yêu cầu.Builder requestBuilder = original.newBuilder().header("mã thông báo", "");
-
- Yêu cầu yêu cầu = requestBuilder.build();
- trở lại chain.proceed(yêu cầu);
- }
- };
-
- }
-
- /**
- * Thiết lập thiết bị chặn và in nhật ký
- *
- * @trở lại
- */
- riêng tư Interceptor getInterceptor() {
-
- HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
- //hiển thị nhật ký
- interceptor.setLevel(HttpLoggingInterceptor.Mức độ.THÂN HÌNH);
-
- trở lại máy đánh chặn;
- }
-
- công cộng OkHttpClient lấy OkHttpClient() {
- nếu (okHttpClient == vô giá trị) {
- // Nếu là DEBUG, hãy in nhật ký
- nếu (BuildConfig.DEBUG) {
- okHttpClient = OkHttpClient mới().newBuilder()
- // Đặt tiêu đề
- .addInterceptor(getHeaderInterceptor())
- //Đặt bộ chặn
- .addInterceptor(getInterceptor())
- .xây dựng();
- } khác {
- okHttpClient = OkHttpClient mới().newBuilder()
- // Đặt tiêu đề
- .addInterceptor(getHeaderInterceptor())
- .xây dựng();
- }
- }
- trở lại okHttpClient;
- }
- công cộng Dịch vụ API lấy Api() {
- // Khởi tạo một máy khách, nếu không thì retrofit sẽ thêm một máy khách theo mặc định
- nếu (cải tiến == vô giá trị) {
- retrofit = new Retrofit.Builder()
- // Đặt địa chỉ Url của yêu cầu mạng
- .baseUrl(baseUrl)
- //Đặt trình phân tích dữ liệu
- .addConverterFactory(GsonConverterFactory.tạo nên())
- // Đặt bộ điều hợp yêu cầu mạng để hỗ trợ RxJava và RxAndroid
- .addCallAdapterFactory(RxJava3CallAdapterFactory.tạo nên())
- .client(getOkHttpClient())
- .xây dựng();
- }
- // Tạo - giao diện yêu cầu mạng - phiên bản
- nếu (apiService==vô giá trị){
- apiService = cải tiến.tạo nên(Lớp APIService);
- }
- trở lại dịch vụ api;
- }
- }
Chúng tôi đã viết một singleton để có được các khả năng của RetrofitClient và đặt trình xử lý tiêu đề yêu cầu cũng như đặt trình chặn nhật ký OKHTTP.
Sau đó, phương thức getApi được xác định để lấy phiên bản APIService.
Lập kế hoạch luồng RXjava.
- gói com.example.hmsrxjava_demo.net;
-
- nhập com.example.hmsrxjava_demo.HarmonySchedulers;
- nhập org.reactivestreams.Publisher;
- nhập io.reactivex.rxjava3.core.Flowable;
- nhập io.reactivex.rxjava3.core.FlowableTransformer;
- nhập io.reactivex.rxjava3.core.Observable;
- nhập io.reactivex.rxjava3.core.ObservableSource;
- nhập io.reactivex.rxjava3.core.ObservableTransformer;
- nhập io.reactivex.rxjava3.schedulers.Schedulers;
- /**
- * mô tả: Lập kế hoạch luồng RXjava
- */
- công cộng lớp RxScheduler {
- /**
- * Xử lý luồng thống nhất
- *
- * @param Loại chung được chỉ định
- * @trở lại Máy biến áp chảy
- */
- công cộng tĩnh Biến đổi lưu lượng< T, T> Flo_io_main() {
- trở lại FlowableTransformer() mới {
- @Ghi đè
- công cộng Nhà xuất bản áp dụng(Flowable ngược dòng) {
- trở lại upstream.subscribeOn(Schedulers.io())
- .observeOn(HarmonySchedulers.mainThread());
- }
- };
- }
-
- /* *
- * Xử lý luồng thống nhất
- *
- * @param Loại chung được chỉ định
- * @trở lại Biến đổi quan sát được*/
- công cộng tĩnh ObservableTransformer Obs_io_main() {
- trở lại ObservableTransformer() mới {
- @Ghi đè
- công cộng ObservableSource áp dụng( Observable ngược dòng) {
- trở lại upstream.subscribeOn(Schedulers.io())
- .observeOn(HarmonySchedulers.mainThread());
- }
- };
- }
- }
Mã ở đây đề cập đến HarmonySchedulers.mainThread(), không có sẵn trong Android và do chính tôi triển khai trong Android.
Lớp giao diện xử lý các yêu cầu mạng Tất cả các yêu cầu mạng đều được viết bằng APIService. Phương pháp viết tương tự như Retrofitle của Android.
- gói com.example.hmsrxjava_demo.net;
- nhập com.example.hmsrxjava_demo.bean.BaseObjectBean;
- nhập com.example.hmsrxjava_demo.bean.LoginBean;
- nhập io.reactivex.rxjava3.core.Observable;
- nhập retrofit2.http.Field;
- nhập retrofit2.http.FormUrlEncoded;
- nhập retrofit2.http.POST;
- /**
- * Sự miêu tả:
- */
- công cộng giao diện APIService {
-
- /**
- * Đăng nhập
- *
- * Tài khoản tên người dùng @param
- * @tham số mật khẩu mật khẩu
- * @trở lại
- */
- @FormUrlEncoded
- @BƯU KIỆN("người dùng/đăng nhập")
- Observable<>> đăng nhập(@Field("tên người dùng") Chuỗi tên người dùng,
- @Cánh đồng("mật khẩu") Sợi dây mật khẩu);
-
- }
lớp cơ sở
- gói com.example.hmsrxjava_demo.base;
- nhập ohos.aafwk.ability.Ability;
- nhập ohos.aafwk.content.Intent;
-
- công cộng lớp trừu tượng BaseAbility mở rộng Ability {
-
- @Ghi đè
- được bảo vệ void onStart(Ý định ý định) {
- super.onStart(ý định);
- super.setUIContent(getLayoutId());
- initView();
- }
-
-
- @Ghi đè
- được bảo vệ void onStop() {
- super.onStop();
- }
-
-
- /**
- * Đặt bố cục
- *
- * @trở lại
- */
- công cộng tóm tắt số nguyên lấyIdLayout();
-
- /**
- * Khởi tạo chế độ xem
- */
- công cộng trừu tượng void initView();
- }
- gói com.example.hmsrxjava_demo.base;
- nhập ohos.aafwk.content.Intent;
- công cộng lớp trừu tượng BaseMvpAbility mở rộng BaseAbility triển khai BaseView {
- được bảo vệ T mPresenter;
- @Ghi đè
- được bảo vệ void onStart(Ý định ý định) {
- super.onStart(ý định);
- }
- @Ghi đè
- được bảo vệ void onStop() {
- nếu (mPresenter != vô giá trị) {
- mPresenter.detachView();
- }
- super.onStop();
- }
- }
- gói com.example.hmsrxjava_demo.base;
- /**
- * Sự miêu tả:
- */
- công cộng lớp BasePresenter {
- được bảo vệ V mView;
-
-
- /**
- * ràng buộcxem, phương thức này thường được gọi trong quá trình khởi tạo
- *
- * @tham số xem xem
- */
- công cộng void attachView(V xem) {
- này.mView = xem;
- }
-
- /**
- * Hủy liên kếtxem, thường được gọi trong onDestroy
- */
-
- công cộng void tách View() {
- này.mView = vô giá trị;
- }
-
- /**
- * XemCó nên ràng buộc không
- *
- * @trở lại
- */
- công cộng boolean isViewAttached() {
- trở lại mXem != vô giá trị;
- }
- }
- gói com.example.hmsrxjava_demo.base;
-
- /**
- * Sự miêu tả:
- */
- công cộng giao diện BaseView {
-
- /**
- * Hiển thị tải
- */
- void showLoading();
-
- /**
- * Tải ẩn
- */
- hàm ẩn hideLoading();
-
- /**
- * Thu thập dữ liệu không thành công
- * @param errMessage
- */
- void onError(Chuỗi errMessage);
- }
- gói com.example.hmsrxjava_demo.contract;
- nhập com.example.hmsrxjava_demo.base.BaseView;
- nhập com.example.hmsrxjava_demo.bean.BaseObjectBean;
- nhập com.example.hmsrxjava_demo.bean.LoginBean;
- nhập io.reactivex.rxjava3.core.Observable;
-
- /**
- * Sự miêu tả:
- */
- công cộng giao diện MainContract {
- Giao diện Mô hình {
- Observable<>> login(String tên người dùng, String mật khẩu);
- }
-
- giao diện Xem mở rộng BaseView {
- @Ghi đè
- void showLoading();
-
- @Ghi đè
- hàm ẩn hideLoading();
-
- @Ghi đè
- void onError(Chuỗi errMessage);
-
- void onSuccess(BaseObjectBean bean);
- }
-
- giao diện Presenter {
- /**
- * Đăng nhập
- *
- * @param tên người dùng
- * @tham số mật khẩu
- */
- void login(String tên người dùng, String mật khẩu);
- }
- }
- gói com.example.hmsrxjava_demo.model;
- nhập com.example.hmsrxjava_demo.bean.BaseObjectBean;
- nhập com.example.hmsrxjava_demo.bean.LoginBean;
- nhập com.example.hmsrxjava_demo.contract.MainContract;
- nhập com.example.hmsrxjava_demo.net.RetrofitClient;
- nhập io.reactivex.rxjava3.core.Observable;
-
- /**
- * Sự miêu tả:
- */
- công cộng lớp MainModel triển khai MainContract.Model {
- riêng tư tĩnh Chuỗi cuối cùng TAG = "Mô hình chính";
- @Ghi đè
- công cộng Observable<>> login(String tên người dùng, String mật khẩu) {
- Hệ thống.ngoài.println("Đăng nhập MainModel đã được gọi");
- trở lại RetrofitClient.getInstance().getApi().login(tên người dùng,mật khẩu);
- }
- }
- gói com.example.hmsrxjava_demo.presenter;
- nhập com.example.hmsrxjava_demo.base.BasePresenter;
- nhập com.example.hmsrxjava_demo.bean.BaseObjectBean;
- nhập com.example.hmsrxjava_demo.bean.LoginBean;
- nhập com.example.hmsrxjava_demo.contract.MainContract;
- nhập com.example.hmsrxjava_demo.model.MainModel;
- nhập com.example.hmsrxjava_demo.net.RxScheduler;
- nhập io.reactivex.rxjava3.annotations.NonNull;
- nhập io.reactivex.rxjava3.core.Observer;
- nhập io.reactivex.rxjava3.disposables.Disposable;
- /**
- * Sự miêu tả:
- */
- công cộng lớp MainPresenter mở rộng BasePresenter<>Xem> triển khai MainContract.Presenter {
- mô hình MainContract.Model riêng tư;
- công cộng Người trình bày chính() {
- mô hình = new MainModel();
- }
- @Ghi đè
- công cộng void login(String tên người dùng, String mật khẩu) {
- //XemCó liên kết hay không. Nếu không bị ràng buộc, yêu cầu mạng sẽ không được thực thi.
- nếu (!isViewAttached()) {
- trở lại;
- }
- model.login(tên người dùng, mật khẩu)
- .compose(RxScheduler.Obs_io_main())
- .subscribe(Người quan sát mới<>>() {
- @Ghi đè
- công cộng void onSubscribe(@NonNull Dùng một lần d) {
- mView.showLoading();
- }
-
- @Ghi đè
- công cộng void onNext(@NonNull BaseObjectBean loginBeanBaseObjectBean) {
- mView.onSuccess(loginBeanBaseObjectBean);
- Hệ thống.ngoài.println("onNext ----- >");
- }
-
- @Ghi đè
- công cộng void onError(@NonNull Throwable e) {
- mView.onError(e.getMessage());
- mView. hideLoading();
- }
- @Ghi đè
- công cộng void khi hoàn thành() {
- mView. hideLoading();
- }
- });
-
- }
- }
- gói com.example.hmsrxjava_demo;
- nhập com.example.hmsrxjava_demo.base.BaseMvpAbility;
- nhập com.example.hmsrxjava_demo.bean.BaseObjectBean;
- nhập com.example.hmsrxjava_demo.bean.LoginBean;
- nhập com.example.hmsrxjava_demo.contract.MainContract;
- nhập com.example.hmsrxjava_demo.presenter.MainPresenter;
- nhập ohos.agp.components.Button;
- nhập ohos.agp.components.Component;
- nhập ohos.agp.components.TextField;
- nhập ohos.agp.window.dialog.ToastDialog;
-
-
- công cộng lớp MainAbility mở rộng BaseMvpAbility triển khai MainContract.Xem {
- văn bản TextField riêng tưTên người dùng, textpasswrod;
- Chuỗi tên người dùng riêng tư, mật khẩu;
- Nút riêng tư loginBtn;
- người thuyết trình MainPresenter riêng tư;
- @Ghi đè
- công cộng số nguyên lấy LayoutId() {
- trở lại ResourceTable.Layout_ability_main;
- }
- @Ghi đè
- công cộng void initView() {
- textUsername= (Trường văn bản) findComponentById(ResourceTable.Id_text_username);
- textpasswrod= (TextField) findComponentById(ResourceTable.Id_text_password);
- người thuyết trình=new MainPresenter();
- presenter.attachView(cái này);
- loginBtn= (Nút) findComponentById(ResourceTable.Id_login_btn);
- nếu(loginBtn!=vô giá trị){
- loginBtn.setClickedListener(Thành phần mới.ClickedListener() {
- @Ghi đè
- công cộng void onClick(Thành phần thành phần) {
- Hệ thống.ngoài.println("Nhấp vào nút đăng nhập");
- tên người dùng=văn bảnTên người dùng.getText();
- mật khẩu=textpasswrod.getText();
- nếu(tên người dùng!=vô giá trị&&mật khẩu!=vô giá trị){
- presenter.login(tên người dùng,mật khẩu);
- // đăng nhập(tên người dùng,mật khẩu);
- }khác {
- mới ToastDialog(MainAbility.this).setText("Mật khẩu tài khoản không thể để trống nếu bạn không nhập").trình diễn(); }
- }
- });
- }
- }
- @Ghi đè
- công cộng void onSuccess(BaseObjectBean đậu) {
- Hệ thống.ngoài.println(bean.getErrorCode()+bean.getErrorMsg());
- mới ToastDialog(MainAbility.this).setText(bean.getErrorCode()+bean.getErrorMsg()).show();
- }
- @Ghi đè
- công cộng void showLoading() {
- }
- @Ghi đè
- công cộng void hideLoading() {
-
- }
- @Ghi đè
- công cộng void onError(Chuỗi errMessage) {
- }
- }
Tại thời điểm này, hướng dẫn triển khai Hongmeng MVP+ Rxjava+Retrofit+okhttp rất giống với cách sử dụng Android. Nhiều mã ở đây được sao chép. Học sinh có thể tải xuống mã hoàn chỉnh để dùng thử.
Tóm tắt cuối cùng:
MVP+ Rxjava+Retrofit+okhttp trong Hongmeng về cơ bản giống như trong Android, nhưng có một số điều hơi ngạc nhiên. Nếu học viên chưa quen với Rxjava+Retrofit+okhttp, trước tiên hãy xem phần hướng dẫn chính thức. chưa quen với chế độ MVP, vui lòng đọc cho tôi các bài viết trước.
Link gốc: https://harmonyos.51cto.com.
Cuối cùng, bài viết này về hướng dẫn triển khai Hongmeng MVP+ Rxjava+Retrofit+okhttp kết thúc tại đây. Nếu bạn muốn biết thêm về hướng dẫn triển khai Hongmeng MVP+ Rxjava+Retrofit+okhttp, vui lòng tìm kiếm các bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. tất cả sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!