| | |
| | | import java.util.stream.Collectors; |
| | | |
| | | import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; |
| | | import io.reactivex.rxjava3.disposables.CompositeDisposable; |
| | | import io.reactivex.rxjava3.schedulers.Schedulers; |
| | | |
| | | /** |
| | |
| | | |
| | | MarkerBean mMarkerBean; |
| | | |
| | | // 添加CompositeDisposable来管理所有订阅 |
| | | private CompositeDisposable compositeDisposable = new CompositeDisposable(); |
| | | |
| | | @Override |
| | | public void onAttach(@NonNull Context context) { |
| | | super.onAttach(context); |
| | |
| | | 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 |
| | |
| | | @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"); |
| | |
| | | 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() { |
| | |
| | | * 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) { |
| | |
| | | }) |
| | | .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 { |
| | |
| | | } |
| | | |
| | | /** |
| | | * 添加取水口标注 |
| | | * 添加管网标注 |
| | | */ |
| | | public void setMapDivide(PipeNetworkBean pipeNetworkBean) { |
| | | // if (divide != null) { |
| | |
| | | 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()); |
| | | } |
| | |
| | | CrashReport.postCatchedException(e); |
| | | } |
| | | } |
| | | |
| | | }); |
| | | } |
| | | |
| | |
| | | @Override |
| | | public void onDestroy() { |
| | | super.onDestroy(); |
| | | // 清理所有订阅 |
| | | if (compositeDisposable != null && !compositeDisposable.isDisposed()) { |
| | | compositeDisposable.dispose(); |
| | | } |
| | | LiveEventBus.get(CommonKeyName.locationData).removeObserver(locationObserver); |
| | | if (mWebView != null) { |
| | | mWebView.destroy(); |