管灌系统巡查员智能手机App
app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java
@@ -78,6 +78,7 @@
import java.util.stream.Collectors;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.schedulers.Schedulers;
/**
@@ -116,6 +117,9 @@
    MarkerBean mMarkerBean;
    // 添加CompositeDisposable来管理所有订阅
    private CompositeDisposable compositeDisposable = new CompositeDisposable();
    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
@@ -130,6 +134,13 @@
        setRetainInstance(true);
        Log.i(TAG, "onCreate");
        mInspectionState = SharedPreferencesHelper.getInstance(this.getContext()).get(CommonKeyName.inspectionState, 0);
        // 添加刷新数据的监听
        LiveEventBus.get(CommonKeyName.refreshData).observe(this, o -> {
            getCenterPoint();
            getMarkerData();
            getDivideList();
        });
    }
    @Override
@@ -142,7 +153,6 @@
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        binding = FragmentMapBinding.inflate(inflater, container, false);
        mapFragmenObserver.setmWebView(binding.webView);
        Log.i("MapFragment", "onCreateView");
@@ -151,15 +161,87 @@
        MyWebViewInterface myWebViewInterface = new MyWebViewInterface(MapFragment.this);
        mWebView.addJavascriptInterface(myWebViewInterface, "Android");
        mWebView.loadUrl("file:///android_asset/index.html");
        getCenterPoint();
        // 异步加载本地数据
        loadLocalData();
        initView();
        initWeb();
        getMarkerData();
        getDivideList();
        chageInspecState(mInspectionState);
        return binding.getRoot();
    }
    /**
     * 异步加载本地数据
     */
    private void loadLocalData() {
        // 异步加载中心点数据
        compositeDisposable.add(
            DaoSingleton.getAsynchInstance(this.getContext()).centerPointDao().findFirst()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(result -> {
                    centerPointBean = result;
                    if (centerPointBean == null) {
                        getCenterPoint();
                    } else {
                        jumpCenterPoint();
                    }
                }, throwable -> {
                    Log.e(TAG, "Load centerPoint error: " + throwable);
                    getCenterPoint();
                }, () -> {
                    // 当Maybe为空时调用
                    getCenterPoint();
                })
        );
        // 异步加载取水口数据
        compositeDisposable.add(
            DaoSingleton.getAsynchInstance(this.getContext()).markerDao().getAll()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(markers -> {
                    if (markers == null || markers.isEmpty()) {
                        getMarkerData();
                    } else {
                        for (MarkerBean marker : markers) {
                            markerBeanSet.put(marker.getId(), marker);
                            setMapMarker(marker);
                        }
                    }
                }, throwable -> {
                    Log.e(TAG, "Load markers error: " + throwable.getMessage());
                    getMarkerData();
                }, () -> {
                    // 当Maybe为空时调用
                    getMarkerData();
                })
        );
        // 异步加载分水房数据
        compositeDisposable.add(
            DaoSingleton.getAsynchInstance(this.getContext()).divideDao().getAll()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(divides -> {
                    if (divides == null || divides.isEmpty()) {
                        getDivideList();
                    } else {
                        for (DivideBean divide : divides) {
                            divideBeanMap.put(divide.getId(), divide);
                            setMapDivide(divide);
                        }
                    }
                }, throwable -> {
                    Log.e(TAG, "Load divides error: " + throwable.getMessage());
                    getDivideList();
                }, () -> {
                    // 当Maybe为空时调用
                    getDivideList();
                })
        );
    }
    private void initWeb() {
@@ -232,9 +314,10 @@
     * web加载完初始化本地数据
     */
    public void webFinishInitLocalData() {
        //跳转中心点
        centerPointBean = DaoSingleton.getInstance(MapFragment.this.getContext()).centerPointDao().findFirst();
        jumpCenterPoint();
        // 只在本地没有数据时获取中心点
        if (centerPointBean != null) {
            jumpCenterPoint();
        }
        //添加因webview没有加载完成导致没有添加的地图标注
        if (!webNoFinishMarkerData.isEmpty()) {
            for (MarkerBean bean : webNoFinishMarkerData) {
@@ -285,18 +368,22 @@
                                })
                                .collect(Collectors.toList());
                        DaoSingleton.getInstance(MapFragment.this.getContext()).markerDao().deleteAll();
                        // 使用 RxJava 异步插入数据
                        DaoSingleton.getAsynchInstance(MapFragment.this.getContext()).markerDao().insertAll(markerBeans)
                                .subscribeOn(Schedulers.io()) // 在 IO 线程上执行
                                .observeOn(AndroidSchedulers.mainThread()) // 在主线程上观察
                                .subscribe(() -> {
                                    // 插入成功
                                    Log.i("mWebView", "数据插入成功");
                                }, throwable -> {
                                    // 插入失败
                                    Log.e("mWebView", "数据插入失败: " + throwable.getMessage());
                                });
                        // 使用 CompositeDisposable 管理数据库插入操作
                        compositeDisposable.add(
                            DaoSingleton.getAsynchInstance(MapFragment.this.getContext()).markerDao().insertAll(markerBeans)
                                .subscribeOn(Schedulers.io())
                                .observeOn(AndroidSchedulers.mainThread())
                                .subscribe(
                                    () -> {
                                        // 插入成功
                                        Log.i("mWebView", "数据插入成功");
                                    },
                                    throwable -> {
                                        // 插入失败
                                        Log.e("mWebView", "数据插入失败: " + throwable.getMessage());
                                    }
                                )
                        );
                    }
                } else {
@@ -629,7 +716,7 @@
    }
    /**
     * 添加取水口标注
     * 添加管网标注
     */
    public void setMapDivide(PipeNetworkBean pipeNetworkBean) {
//        if (divide != null) {
@@ -917,27 +1004,30 @@
                try {
                    if (t.isSuccess()) {
                        if (t.getContent().getObj() != null && !t.getContent().getObj().isEmpty()) {
                            List<DivideBean> divideBeans = new ArrayList<>();
                            for (DivideResult divideResult : t.getContent().getObj()) {
                                DivideBean divideBean = getDivideBean(divideResult);
                                setMapDivide(divideBean);
                                divideBeans.add(divideBean);
                            }
                            // 使用 RxJava 异步插入数据
                            DaoSingleton.getAsynchInstance(MapFragment.this.getContext()).divideDao().insertAll(divideBeans)
                                    .subscribeOn(Schedulers.io()) // 在 IO 线程上执行
                                    .observeOn(AndroidSchedulers.mainThread()) // 在主线程上观察
                                    .subscribe(() -> {
                                        // 插入成功
                                        Log.i("mWebView", "数据插入成功");
                                    }, throwable -> {
                                        // 插入失败
                                        Log.e("mWebView", "数据插入失败: " + throwable.getMessage());
                                    });
                            // 使用 CompositeDisposable 管理数据库插入操作
                            compositeDisposable.add(
                                DaoSingleton.getAsynchInstance(MapFragment.this.getContext()).divideDao().insertAll(divideBeans)
                                    .subscribeOn(Schedulers.io())
                                    .observeOn(AndroidSchedulers.mainThread())
                                    .subscribe(
                                        () -> {
                                            // 插入成功
                                            Log.i("mWebView", "数据插入成功");
                                        },
                                        throwable -> {
                                            // 插入失败
                                            Log.e("mWebView", "数据插入失败: " + throwable.getMessage());
                                        }
                                    )
                            );
                        }
                    } else {
                        ToastUtil.showToastLong(MapFragment.this.getContext(), t.getMsg());
                    }
@@ -946,7 +1036,6 @@
                    CrashReport.postCatchedException(e);
                }
            }
        });
    }
@@ -1031,6 +1120,10 @@
    @Override
    public void onDestroy() {
        super.onDestroy();
        // 清理所有订阅
        if (compositeDisposable != null && !compositeDisposable.isDisposed()) {
            compositeDisposable.dispose();
        }
        LiveEventBus.get(CommonKeyName.locationData).removeObserver(locationObserver);
        if (mWebView != null) {
            mWebView.destroy();