|  |  | 
 |  |  | import android.content.Context; | 
 |  |  | import android.content.Intent; | 
 |  |  | import android.content.res.Resources; | 
 |  |  | import android.location.LocationManager; | 
 |  |  | import android.os.Build; | 
 |  |  | import android.net.Uri; | 
 |  |  | import android.os.Bundle; | 
 |  |  | import android.text.TextUtils; | 
 |  |  | import android.util.Log; | 
 |  |  | 
 |  |  |  | 
 |  |  | import androidx.annotation.NonNull; | 
 |  |  | import androidx.annotation.Nullable; | 
 |  |  | import androidx.core.content.ContextCompat; | 
 |  |  | import androidx.lifecycle.Observer; | 
 |  |  |  | 
 |  |  | import com.dayu.pipirrapp.MyApplication; | 
 |  |  | import com.dayu.pipirrapp.R; | 
 |  |  | import com.dayu.pipirrapp.activity.AddIssueActivity; | 
 |  |  | import com.dayu.pipirrapp.bean.db.CenterPointBean; | 
 |  |  | import com.dayu.pipirrapp.bean.db.DivideBean; | 
 |  |  | import com.dayu.pipirrapp.bean.db.InspectionBean; | 
 |  |  | import com.dayu.pipirrapp.bean.db.InspectionLocationBean; | 
 |  |  | import com.dayu.pipirrapp.bean.db.LatLonBean; | 
 |  |  | import com.dayu.pipirrapp.bean.db.MarkerBean; | 
 |  |  | import com.dayu.pipirrapp.bean.db.PipeNetWorkDataBean; | 
 |  |  | import com.dayu.pipirrapp.bean.db.PipeNetworkBean; | 
 |  |  | import com.dayu.pipirrapp.bean.db.PipeNetworkDataCoordinateBean; | 
 |  |  | import com.dayu.pipirrapp.bean.net.BaseListResult; | 
 |  |  | import com.dayu.pipirrapp.bean.net.CenterPointResult; | 
 |  |  | import com.dayu.pipirrapp.bean.net.DivideListResult; | 
 |  |  | import com.dayu.pipirrapp.bean.net.DivideResult; | 
 |  |  | import com.dayu.pipirrapp.bean.net.InsectionResult; | 
 |  |  | import com.dayu.pipirrapp.bean.net.InspectionRequest; | 
 |  |  | import com.dayu.pipirrapp.bean.net.IntakeListResult; | 
 |  |  | import com.dayu.pipirrapp.bean.net.IntakeResult; | 
 |  |  | import com.dayu.pipirrapp.bean.net.MarkerListResult; | 
 |  |  | import com.dayu.pipirrapp.bean.net.MarkerResult; | 
 |  |  | import com.dayu.pipirrapp.bean.net.PipeNetworkResult; | 
 |  |  | import com.dayu.pipirrapp.dao.DaoSingleton; | 
 |  |  | import com.dayu.pipirrapp.databinding.FragmentMapBinding; | 
 |  |  | import com.dayu.pipirrapp.js.MyWebViewInterface; | 
 |  |  | import com.dayu.pipirrapp.net.ApiManager; | 
 |  |  | import com.dayu.pipirrapp.net.BaseResponse; | 
 |  |  | import com.dayu.pipirrapp.net.Constants; | 
 |  |  | import com.dayu.pipirrapp.net.subscribers.SubscriberListener; | 
 |  |  | import com.dayu.pipirrapp.observer.MapFragmenObserver; | 
 |  |  | import com.dayu.pipirrapp.service.MyLocationService; | 
 |  |  | import com.dayu.pipirrapp.tool.InspectionUtils; | 
 |  |  | import com.dayu.pipirrapp.tool.MarkerUtils; | 
 |  |  | import com.dayu.pipirrapp.tool.MyWebViewInterface; | 
 |  |  | import com.dayu.pipirrapp.utils.CommonData; | 
 |  |  | import com.dayu.pipirrapp.utils.CommonKeyName; | 
 |  |  | import com.dayu.pipirrapp.utils.DateUtils; | 
 |  |  | import com.dayu.pipirrapp.utils.MapJpgUtils; | 
 |  |  | import com.dayu.pipirrapp.utils.MyLog; | 
 |  |  | import com.dayu.pipirrapp.utils.ServiceUtils; | 
 |  |  | import com.dayu.pipirrapp.utils.SharedPreferencesHelper; | 
 |  |  | import com.dayu.pipirrapp.utils.ToastUtil; | 
 |  |  | import com.dayu.pipirrapp.utils.WebViewUtils; | 
 |  |  | import com.dayu.pipirrapp.view.ConfirmDialog; | 
 |  |  | import com.dayu.pipirrapp.view.SearchResultDialog; | 
 |  |  | import com.dayu.pipirrapp.view.TipUtil; | 
 |  |  | import com.example.expand_button.ExpandButton; | 
 |  |  | import com.hjq.permissions.OnPermissionCallback; | 
 |  |  | import com.hjq.permissions.Permission; | 
 |  |  | import com.hjq.permissions.XXPermissions; | 
 |  |  | import com.jeremyliao.liveeventbus.LiveEventBus; | 
 |  |  | import com.tencent.bugly.crashreport.CrashReport; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | import java.io.File; | 
 |  |  | import java.io.FileInputStream; | 
 |  |  | import java.io.FileNotFoundException; | 
 |  |  | import java.util.ArrayList; | 
 |  |  | import java.util.HashMap; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.Random; | 
 |  |  | import java.util.Map; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  | import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; | 
 |  |  | import io.reactivex.rxjava3.disposables.CompositeDisposable; | 
 |  |  | import io.reactivex.rxjava3.schedulers.Schedulers; | 
 |  |  | import io.reactivex.rxjava3.core.Single; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * author: zuo | 
 |  |  | 
 |  |  |  | 
 |  |  |     WebView mWebView; | 
 |  |  |     CenterPointBean centerPointBean; | 
 |  |  |     String strMarkerJson; | 
 |  |  |     //当前巡检状态 | 
 |  |  |     int mInspectionState; | 
 |  |  |     MapFragmenObserver mapFragmenObserver; | 
 |  |  |     //当前巡检记录的相关信息 | 
 |  |  |     public InspectionBean mInspectionBean; | 
 |  |  |     //最后一次定位的坐标 | 
 |  |  |     LatLonBean lastLatLonBean; | 
 |  |  |     InspectionRequest inspectionRequest; | 
 |  |  |     volatile boolean isHaseAginData = false; | 
 |  |  |     //web是否加载完成 | 
 |  |  |     volatile boolean webViewIsFinished = false; | 
 |  |  |     List<InspectionLocationBean> aginShowlocationBeans; | 
 |  |  |     //web加载时网页还没加载完时的数据 | 
 |  |  |     List<MarkerBean> webNoFinishMarkerData = new ArrayList<>(); | 
 |  |  |     List<DivideBean> webNoFinishDivideData = new ArrayList<>(); | 
 |  |  |     List<PipeNetworkBean> webNoFinishPipeNetworkData = new ArrayList<>(); | 
 |  |  |     //所有的Marker数据键为marker的Id | 
 |  |  |     Map<String, MarkerBean> markerBeanSet = new HashMap<>(); | 
 |  |  |     //所有分水房 | 
 |  |  |     Map<String, DivideBean> divideBeanMap = new HashMap<>(); | 
 |  |  |     //中心点坐标 | 
 |  |  |     public double centerLng; | 
 |  |  |     public double centerLat; | 
 |  |  |  | 
 |  |  |     MarkerBean mMarkerBean; | 
 |  |  |  | 
 |  |  |     //是否显示Marker | 
 |  |  |     boolean isShowMarker, isShowPipeNetwork, isShowDivide; | 
 |  |  |  | 
 |  |  |     // 添加CompositeDisposable来管理所有订阅 | 
 |  |  |     private CompositeDisposable compositeDisposable = new CompositeDisposable(); | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public void onAttach(@NonNull Context context) { | 
 |  |  | 
 |  |  |     @Override | 
 |  |  |     public void onCreate(@Nullable Bundle savedInstanceState) { | 
 |  |  |         super.onCreate(savedInstanceState); | 
 |  |  |         setRetainInstance(true); | 
 |  |  |         Log.i(TAG, "onCreate"); | 
 |  |  |         mInspectionState = SharedPreferencesHelper.getInstance(this.getContext()).get(CommonKeyName.inspectionState, 0); | 
 |  |  |  | 
 |  |  |         // 添加刷新数据的监听 | 
 |  |  |         LiveEventBus.get(CommonKeyName.refreshData).observe(this, o -> { | 
 |  |  |             // 显示加载动画 | 
 |  |  |             TipUtil.showLoading(MapFragment.this.getActivity(), "正在更新数据..."); | 
 |  |  |  | 
 |  |  |             // 创建多个Single对象来表示每个网络请求 | 
 |  |  |             Single<Boolean> centerPointSingle = Single.create(emitter -> { | 
 |  |  |                 getCenterPoint(); | 
 |  |  |                 emitter.onSuccess(true); | 
 |  |  |             }); | 
 |  |  |  | 
 |  |  |             Single<Boolean> markerDataSingle = Single.create(emitter -> { | 
 |  |  |                 getMarkerData(); | 
 |  |  |                 emitter.onSuccess(true); | 
 |  |  |             }); | 
 |  |  |  | 
 |  |  |             Single<Boolean> divideListSingle = Single.create(emitter -> { | 
 |  |  |                 getDivideList(); | 
 |  |  |                 emitter.onSuccess(true); | 
 |  |  |             }); | 
 |  |  |  | 
 |  |  |             Single<Boolean> pipeNetworkListSingle = Single.create(emitter -> { | 
 |  |  |                 getPipeNetworkList(); | 
 |  |  |                 emitter.onSuccess(true); | 
 |  |  |             }); | 
 |  |  |  | 
 |  |  |             // 组合所有Single | 
 |  |  |             compositeDisposable.add( | 
 |  |  |                     Single.zip( | 
 |  |  |                                     centerPointSingle, | 
 |  |  |                                     markerDataSingle, | 
 |  |  |                                     divideListSingle, | 
 |  |  |                                     pipeNetworkListSingle, | 
 |  |  |                                     (centerPoint, marker, divide, pipe) -> true | 
 |  |  |                             ) | 
 |  |  |                             .subscribeOn(Schedulers.io()) | 
 |  |  |                             .observeOn(AndroidSchedulers.mainThread()) | 
 |  |  |                             .doFinally(() -> { | 
 |  |  |                                 // 无论成功还是失败,都需要隐藏加载动画 | 
 |  |  |                                 TipUtil.dismissLoading(); | 
 |  |  |                             }) | 
 |  |  |                             .subscribe( | 
 |  |  |                                     result -> { | 
 |  |  |                                         ToastUtil.showToast(MapFragment.this.getContext(), "数据更新完成"); | 
 |  |  |                                     }, | 
 |  |  |                                     throwable -> { | 
 |  |  |                                         Log.e(TAG, "数据更新失败: " + throwable.getMessage()); | 
 |  |  |                                         ToastUtil.showToast(MapFragment.this.getContext(), "数据更新失败"); | 
 |  |  |                                     } | 
 |  |  |                             ) | 
 |  |  |             ); | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @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(); | 
 |  |  |         initLocalData(); | 
 |  |  |         getMarkerData(); | 
 |  |  |         //显示巡检状态并且显示因意外关闭的历史数据 | 
 |  |  |         switch (mInspectionState) { | 
 |  |  |             case InspectionUtils.STAT_INSPECTION: | 
 |  |  |             case InspectionUtils.PAUSE_INSPECTION: | 
 |  |  |                 InspectionUtils.aginShowLocation(MapFragment.this); | 
 |  |  |         } | 
 |  |  |         initWeb(); | 
 |  |  |  | 
 |  |  |         chageInspecState(mInspectionState); | 
 |  |  |         return binding.getRoot(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 初始化各个状态 | 
 |  |  |      * 异步加载本地数据 | 
 |  |  |      */ | 
 |  |  |     private void initState() { | 
 |  |  |         //开启定位 | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 初始化本地数据 | 
 |  |  |      */ | 
 |  |  |     public void initLocalData() { | 
 |  |  |         centerPointBean = DaoSingleton.getInstance(MapFragment.this.getContext()).centerPointDao().findFirst(); | 
 |  |  |         List<MarkerBean> markerBeans = DaoSingleton.getInstance(MapFragment.this.getContext()).markerDao().findAll(); | 
 |  |  |         strMarkerJson = WebViewUtils.beanToJson(markerBeans); | 
 |  |  |         jumpCenterPoint(); | 
 |  |  |         setMapMarker(); | 
 |  |  |     } | 
 |  |  |     private void loadLocalData() { | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 跳转地图中心点 | 
 |  |  |      */ | 
 |  |  |     public void jumpCenterPoint() { | 
 |  |  |         if (centerPointBean != null) { | 
 |  |  |             Log.d(TAG, "jumpCenterPoint>>>>>>>>>>>>>>>>>>>" + centerPointBean.getLng() + "\",\"" + centerPointBean.getLat()); | 
 |  |  |             mWebView.evaluateJavascript("javascript:setCenterAndZoom(\"" + centerPointBean.getLng() + "\",\"" + centerPointBean.getLat() + "\",\"" + centerPointBean.getZoomMp() + "\")", value -> { | 
 |  |  |             }); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 添加标注点 | 
 |  |  |      */ | 
 |  |  |     public void setMapMarker() { | 
 |  |  |         Log.i("mWebView", "addMarker????????????" + strMarkerJson); | 
 |  |  |         mWebView.evaluateJavascript("javascript:addMarker(\"" + strMarkerJson + "\")", new ValueCallback<String>() { | 
 |  |  |             @Override | 
 |  |  |             public void onReceiveValue(String value) { | 
 |  |  |                 Log.i("mWebView", "addMarker!!!!!!!!!" + value); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取取水口列表 | 
 |  |  |      */ | 
 |  |  |     private void getMarkerData() { | 
 |  |  |         ApiManager.getInstance().requestGetHideLoading(this.getContext(), Constants.BASE_URL + "/project/intake/all", MarkerResult.class, null, new SubscriberListener<BaseResponse<MarkerResult>>() { | 
 |  |  |             @Override | 
 |  |  |             public void onNext(BaseResponse<MarkerResult> t) { | 
 |  |  |                 if (t.isSuccess()) { | 
 |  |  |                     if (t.isSuccess()) { | 
 |  |  |                         if (t.getContent().getObj() != null && !t.getContent().getObj().isEmpty()) { | 
 |  |  |                             List<MarkerBean> markerBeans = new ArrayList<>(); | 
 |  |  |                             for (int i = 0; i < t.getContent().getObj().size(); i++) { | 
 |  |  |                                 MarkerResult.Obj result = t.getContent().getObj().get(i); | 
 |  |  |                                 //保存数据 | 
 |  |  |                                 MarkerBean markerBean = new MarkerBean(); | 
 |  |  |                                 markerBean.setLng(result.getLng()); | 
 |  |  |                                 markerBean.setLat(result.getLat()); | 
 |  |  |                                 markerBean.setBlockId(result.getBlockId()); | 
 |  |  |                                 markerBean.setName(result.getName()); | 
 |  |  |                                 markerBean.setRemarks(result.getRemarks()); | 
 |  |  |                                 markerBean.setTownId(result.getTownId()); | 
 |  |  |                                 markerBean.setVillageId(result.getVillageId()); | 
 |  |  |                                 markerBean.setCountyId(result.getCountyId()); | 
 |  |  |                                 markerBeans.add(markerBean); | 
 |  |  |         // 异步加载中心点数据 | 
 |  |  |         compositeDisposable.add( | 
 |  |  |                 DaoSingleton.getAsynchInstance(this.getContext()).centerPointDao().findFirst() | 
 |  |  |                         .subscribeOn(Schedulers.io()) | 
 |  |  |                         .observeOn(AndroidSchedulers.mainThread()) | 
 |  |  |                         .subscribe(result -> { | 
 |  |  |                             centerPointBean = result; | 
 |  |  |                             if (centerPointBean == null) { | 
 |  |  |                                 getCenterPoint(); | 
 |  |  |                             } else { | 
 |  |  |                                 jumpCenterPoint(); | 
 |  |  |                             } | 
 |  |  |                             strMarkerJson = WebViewUtils.beanToJson(markerBeans); | 
 |  |  |                             setMapMarker(); | 
 |  |  |                             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()); | 
 |  |  |                                     }); | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } else { | 
 |  |  |                     ToastUtil.showToast(MapFragment.this.getContext(), t.getMsg()); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |                         }, throwable -> { | 
 |  |  |                             Log.e(TAG, "Load centerPoint error: " + throwable); | 
 |  |  |                             getCenterPoint(); | 
 |  |  |                         }, () -> { | 
 |  |  |                             // 当Maybe为空时调用 | 
 |  |  |                             getCenterPoint(); | 
 |  |  |                         }) | 
 |  |  |         ); | 
 |  |  |         isShowMarker = SharedPreferencesHelper.getInstance(this.getContext()).get(CommonKeyName.markerKeyIsShow, true); | 
 |  |  |         // 异步加载取水口数据 | 
 |  |  |         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(); | 
 |  |  |                         }) | 
 |  |  |         ); | 
 |  |  |         isShowDivide = SharedPreferencesHelper.getInstance(this.getContext()).get(CommonKeyName.divideIsShow, true); | 
 |  |  |         // 异步加载分水房数据 | 
 |  |  |         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(); | 
 |  |  |                         }) | 
 |  |  |         ); | 
 |  |  |  | 
 |  |  |         }); | 
 |  |  |         isShowPipeNetwork = SharedPreferencesHelper.getInstance(this.getContext()).get(CommonKeyName.pipeNetworkIsShow, true); | 
 |  |  |         //异步加载管网数据 | 
 |  |  |         compositeDisposable.add( | 
 |  |  |                 DaoSingleton.getAsynchInstance(this.getContext()).pipeNetDao().getAll() | 
 |  |  |                         .subscribeOn(Schedulers.io()) | 
 |  |  |                         .observeOn(AndroidSchedulers.mainThread()) | 
 |  |  |                         .subscribe(pipeNetworkBeans -> { | 
 |  |  |                             if (pipeNetworkBeans == null || pipeNetworkBeans.isEmpty()) { | 
 |  |  |                                 getPipeNetworkList(); | 
 |  |  |                             } else { | 
 |  |  |                                 for (PipeNetworkBean pipeNetworkBean : pipeNetworkBeans) { | 
 |  |  |                                     setMapPipe(pipeNetworkBean); | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         }, throwable -> { | 
 |  |  |                             Log.e(TAG, "Load PipeNetworkBean error: " + throwable.getMessage()); | 
 |  |  |                             getPipeNetworkList(); | 
 |  |  |                         }, () -> { | 
 |  |  |                             // 当Maybe为空时调用 | 
 |  |  |                             getPipeNetworkList(); | 
 |  |  |                         }) | 
 |  |  |         ); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 添加标注点 | 
 |  |  |      */ | 
 |  |  |     public void addMarker() { | 
 |  |  |         Random random = new Random(); | 
 |  |  |         StringBuilder stringBuilder = new StringBuilder(); | 
 |  |  |         stringBuilder.append("["); | 
 |  |  |  | 
 |  |  |         // 中国经纬度范围 | 
 |  |  |         double minLongitude = 73.43; | 
 |  |  |         double maxLongitude = 135.05; | 
 |  |  |         double minLatitude = 3.52; | 
 |  |  |         double maxLatitude = 53.57; | 
 |  |  |  | 
 |  |  |         for (int i = 0; i < 1000; i++) { | 
 |  |  |             stringBuilder.append("["); | 
 |  |  |             // 生成随机经度 | 
 |  |  |             double longitude = minLongitude + (maxLongitude - minLongitude) * random.nextDouble(); | 
 |  |  |             stringBuilder.append(longitude); | 
 |  |  |             stringBuilder.append(","); | 
 |  |  |             // 生成随机纬度 | 
 |  |  |             double latitude = minLatitude + (maxLatitude - minLatitude) * random.nextDouble(); | 
 |  |  |             stringBuilder.append(latitude); | 
 |  |  |             stringBuilder.append(",\"237取水口\"],"); | 
 |  |  |         } | 
 |  |  |         stringBuilder.append("[116.417854,39.921988,\"235取水口\"]]"); | 
 |  |  |         String jsonData = stringBuilder.toString().replace("\\", "\\\\").replace("\"", "\\\""); | 
 |  |  |         Log.i("mWebView", "addMarker????????????" + jsonData); | 
 |  |  |         mWebView.evaluateJavascript("javascript:addMarker(\"" + jsonData + "\")", new ValueCallback<String>() { | 
 |  |  |             @Override | 
 |  |  |             public void onReceiveValue(String value) { | 
 |  |  |                 Log.i("mWebView", "addMarker!!!!!!!!!" + value); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     void initView() { | 
 |  |  |  | 
 |  |  |     private void initWeb() { | 
 |  |  |         mWebView.setWebViewClient(new WebViewClient() { | 
 |  |  |             @Override | 
 |  |  |             public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { | 
 |  |  |                 String url = request.getUrl().toString(); | 
 |  |  | //                Log.d(TAG, "加载地址>>>" + url); | 
 |  |  |                 //判断当前是否为加载瓦片 | 
 |  |  |                 if (MapJpgUtils.getInsatance().isTianDiTuTileRequest(url)) { | 
 |  |  |                     String androidUrl = url.replace(CommonData.webKey, CommonData.androidKey); | 
 |  |  |                     // 检查本地缓存 | 
 |  |  |                     File cachedTile = MapJpgUtils.getInsatance().getCachedTile(androidUrl); | 
 |  |  |                     if (cachedTile != null && cachedTile.exists()) { | 
 |  |  | //                        Log.d(TAG, "本地缓存>>>" + androidUrl); | 
 |  |  | //                        if (MapJpgUtils.getInsatance().validateImageFile(androidUrl,request.)) | 
 |  |  |                         // 判断缓存是否过期 | 
 |  |  | //                    if (!MapJpgUtils.getInsatance(MapFragment.this.getContext()).isCacheExpired(cachedTile)) { | 
 |  |  |                         try { | 
 |  |  |                             // 从缓存加载瓦片 | 
 |  |  |                             return new WebResourceResponse("image/jpg", "utf-8", new FileInputStream(cachedTile)); | 
 |  |  |                         } catch (FileNotFoundException e) { | 
 |  |  |                             e.printStackTrace(); | 
 |  |  |                         // 检查文件是否超过6个月 | 
 |  |  |                         long sixMonthsInMillis = 6L * 30 * 24 * 60 * 60 * 1000; // 6个月的毫秒数 | 
 |  |  |                         long fileAge = System.currentTimeMillis() - cachedTile.lastModified(); | 
 |  |  |  | 
 |  |  |                         if (fileAge > sixMonthsInMillis) { | 
 |  |  |                             // 如果文件超过6个月,删除旧文件并重新下载 | 
 |  |  |                             if (cachedTile.delete()) { | 
 |  |  |                                 Log.d(TAG, "已删除过期瓦片: " + androidUrl); | 
 |  |  |                             } else { | 
 |  |  |                                 Log.e(TAG, "删除过期瓦片失败: " + androidUrl); | 
 |  |  |                             } | 
 |  |  |                             ApiManager.getInstance().donwLoadTile(MapFragment.this.getContext(), androidUrl); | 
 |  |  |                         } else { | 
 |  |  |                             try { | 
 |  |  |                                 // 从缓存加载瓦片 | 
 |  |  |                                 return new WebResourceResponse("image/jpg", "utf-8", new FileInputStream(cachedTile)); | 
 |  |  |                             } catch (FileNotFoundException e) { | 
 |  |  |                                 e.printStackTrace(); | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  | //                    } | 
 |  |  |                     } else { | 
 |  |  |                         //下载瓦片 | 
 |  |  |                         ApiManager.getInstance().donwLoadTile(MapFragment.this.getContext(), androidUrl); | 
 |  |  |                     } | 
 |  |  | //                    Log.d(TAG, "在线加载>>>" + url); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |                 return super.shouldInterceptRequest(view, request); | 
 |  |  |             } | 
 |  |  | 
 |  |  |                 String failingUrl = request.getUrl().toString(); | 
 |  |  |                 Log.e("setWebViewClient", "errorCode:" + errorCode + ">>>>description:" + description + ">>>>failingUrl:" + failingUrl); | 
 |  |  |                 // 处理错误,例如显示错误页面或提示用户 | 
 |  |  |                 // view.loadUrl("file:///android_asset/error.html"); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             @Override | 
 |  |  | 
 |  |  |             @Override | 
 |  |  |             public void onPageFinished(WebView view, String url) { | 
 |  |  |                 super.onPageFinished(view, url); | 
 |  |  |                 webViewIsFinished = true; | 
 |  |  |                 //页面加载完成 | 
 |  |  |                 if (isHaseAginData) { | 
 |  |  |                     aginShowLocation(null); | 
 |  |  |                 } | 
 |  |  |                 webViewIsFinished = true; | 
 |  |  |                 webFinishInitLocalData(); | 
 |  |  |                 aginShowLocation(null); | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * web加载完初始化本地数据 | 
 |  |  |      */ | 
 |  |  |     public void webFinishInitLocalData() { | 
 |  |  |         // 只在本地没有数据时获取中心点 | 
 |  |  |         if (centerPointBean != null) { | 
 |  |  |             jumpCenterPoint(); | 
 |  |  |         } | 
 |  |  |         //添加因webview没有加载完成导致没有添加的地图标注 | 
 |  |  |         if (!webNoFinishMarkerData.isEmpty()) { | 
 |  |  |             for (MarkerBean bean : webNoFinishMarkerData) { | 
 |  |  |                 setMapMarker(bean); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         if (!webNoFinishDivideData.isEmpty()) { | 
 |  |  |             for (DivideBean bean : webNoFinishDivideData) { | 
 |  |  |                 setMapDivide(bean); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         if (!webNoFinishPipeNetworkData.isEmpty()) { | 
 |  |  |             for (PipeNetworkBean bean : webNoFinishPipeNetworkData) { | 
 |  |  |                 setMapPipe(bean); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         //显示所有取水口 | 
 |  |  |         MarkerUtils.showLocoMarks(MapFragment.this); | 
 |  |  |         //显示巡检状态并且显示因意外关闭的历史数据 | 
 |  |  |         switch (mInspectionState) { | 
 |  |  |             case InspectionUtils.STAT_INSPECTION: | 
 |  |  |             case InspectionUtils.PAUSE_INSPECTION: | 
 |  |  |                 InspectionUtils.aginShowLocation(MapFragment.this); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取取水口列表 | 
 |  |  |      */ | 
 |  |  |     private void getMarkerData() { | 
 |  |  |         ApiManager.getInstance().requestGetHideLoading(this.getContext(), Constants.BASE_URL + "/project/intake/all", MarkerListResult.class, null, new SubscriberListener<BaseResponse<MarkerListResult>>() { | 
 |  |  |             @Override | 
 |  |  |             public void onNext(BaseResponse<MarkerListResult> t) { | 
 |  |  |                 if (t.isSuccess()) { | 
 |  |  |                     if (t.getContent().getObj() != null && !t.getContent().getObj().isEmpty()) { | 
 |  |  |                         List<MarkerBean> markerBeans = t.getContent().getObj().stream() | 
 |  |  |                                 .map(result -> { | 
 |  |  |                                     MarkerBean markerBean = new MarkerBean(); | 
 |  |  |                                     markerBean.setId(result.getId()); | 
 |  |  |                                     markerBean.setLng(result.getLng()); | 
 |  |  |                                     markerBean.setLat(result.getLat()); | 
 |  |  |                                     markerBean.setBlockId(result.getBlockId()); | 
 |  |  |                                     markerBean.setName(result.getName()); | 
 |  |  |                                     markerBean.setRemarks(result.getRemarks()); | 
 |  |  |                                     markerBean.setTownId(result.getTownId()); | 
 |  |  |                                     markerBean.setVillageId(result.getVillageId()); | 
 |  |  |                                     markerBean.setCountyId(result.getCountyId()); | 
 |  |  |                                     markerBean.setAddress(result.getAddress()); | 
 |  |  |                                     markerBean.setBlockName(result.getBlockName()); | 
 |  |  |                                     markerBean.setDivideId(result.getDivideId()); | 
 |  |  |                                     setMapMarker(markerBean); | 
 |  |  |                                     return markerBean; | 
 |  |  |                                 }) | 
 |  |  |                                 .collect(Collectors.toList()); | 
 |  |  |                         DaoSingleton.getInstance(MapFragment.this.getContext()).markerDao().deleteAll(); | 
 |  |  |                         // 使用 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 { | 
 |  |  |                     ToastUtil.showToast(MapFragment.this.getContext(), t.getMsg()); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     void initView() { | 
 |  |  |  | 
 |  |  |         //巡检按钮 | 
 |  |  |         binding.inspectButton.setOnClickListener(v -> { | 
 |  |  |             if (XXPermissions.isGranted(MapFragment.this.getContext(), Permission.ACCESS_BACKGROUND_LOCATION)) { | 
 |  |  |                 chageInspecState(InspectionUtils.STAT_INSPECTION_ONCLICK); | 
 |  |  |                 new ConfirmDialog(MapFragment.this.getActivity(), "确认开始巡检吗?", (confirmDialog, v1) -> { | 
 |  |  |                     chageInspecState(InspectionUtils.STAT_INSPECTION_ONCLICK); | 
 |  |  |                     confirmDialog.dismiss(); | 
 |  |  |                 }).show(); | 
 |  |  |  | 
 |  |  |             } else { | 
 |  |  |                 TipUtil.show(MapFragment.this.getActivity(), "巡检定位需要您选择\"始终允许\"定位信息,否则无法巡检。", new TipUtil.TipListener() { | 
 |  |  |                     @Override | 
 |  |  | 
 |  |  |         }); | 
 |  |  |         //上报问题 | 
 |  |  |         binding.putButton.setOnClickListener(v -> { | 
 |  |  |             Intent issue = new Intent(MapFragment.this.getActivity(), AddIssueActivity.class); | 
 |  |  |             MapFragment.this.getActivity().startActivity(issue); | 
 |  |  |             new ConfirmDialog(MapFragment.this.getActivity(), "确认上报问题吗?", (confirmDialog, v1) -> { | 
 |  |  |                 Intent issue = new Intent(MapFragment.this.getActivity(), AddIssueActivity.class); | 
 |  |  |                 MapFragment.this.getActivity().startActivity(issue); | 
 |  |  |                 confirmDialog.dismiss(); | 
 |  |  |             }).show(); | 
 |  |  |  | 
 |  |  |  | 
 |  |  |         }); | 
 |  |  |         binding.expandButton.setLegendsArray(new ExpandButton.Quadruple( | 
 |  |  |                         ContextCompat.getDrawable(requireContext(), R.drawable.marker_blue), | 
 |  |  |                         ContextCompat.getDrawable(requireContext(), R.drawable.marker_unselected), | 
 |  |  |                         "取水口", isShowMarker | 
 |  |  |                 ), | 
 |  |  |                 new ExpandButton.Quadruple( | 
 |  |  |                         ContextCompat.getDrawable(requireContext(), R.drawable.divide_home_blue), | 
 |  |  |                         ContextCompat.getDrawable(requireContext(), R.drawable.divide_home_unselected), | 
 |  |  |                         "分水房", isShowDivide | 
 |  |  |                 ), | 
 |  |  |                 new ExpandButton.Quadruple( | 
 |  |  |                         ContextCompat.getDrawable(requireContext(), R.drawable.ic_pipenetwork_line), | 
 |  |  |                         ContextCompat.getDrawable(requireContext(), R.drawable.ic_pipenetwork_line_unselected), | 
 |  |  |                         "管网", isShowPipeNetwork | 
 |  |  |                 ) | 
 |  |  |         ); | 
 |  |  |         binding.expandButton.setOnLegendItemClickListener((position, isSelected) -> { | 
 |  |  |             switch (position) { | 
 |  |  |                 case 0: | 
 |  |  |                     showMarkers(isSelected); | 
 |  |  |                     SharedPreferencesHelper.getInstance(this.getContext()).put(CommonKeyName.markerKeyIsShow, isSelected); | 
 |  |  |                     break; | 
 |  |  |                 case 1: | 
 |  |  |                     showDivideMarkers(isSelected); | 
 |  |  |                     SharedPreferencesHelper.getInstance(this.getContext()).put(CommonKeyName.divideIsShow, isSelected); | 
 |  |  |                     break; | 
 |  |  |                 case 2: | 
 |  |  |                     showPipeLine(isSelected); | 
 |  |  |                     SharedPreferencesHelper.getInstance(this.getContext()).put(CommonKeyName.pipeNetworkIsShow, isSelected); | 
 |  |  |                     break; | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |         binding.searchButton.setOnSearchClickListener(s -> { | 
 |  |  |             if (s != null && !s.isEmpty()) { | 
 |  |  |                 SearchResultDialog searchDialog = new SearchResultDialog(requireContext()); | 
 |  |  |                 searchDialog.setOnItemClickListener(item -> { | 
 |  |  |                     // 根据类型处理点击事件 | 
 |  |  | //                    if ("marker".equals(item.getType())) { | 
 |  |  | //                        MarkerBean markerBean = new MarkerBean(); | 
 |  |  | //                        markerBean.setId(item.getId()); | 
 |  |  | //                        getInstakeDetail(markerBean); | 
 |  |  | //                    } else { | 
 |  |  | //                        DivideBean divideBean = new DivideBean(); | 
 |  |  | //                        divideBean.setDivideId(item.getId()); | 
 |  |  | //                        getDivideDetail(divideBean); | 
 |  |  | //                    } | 
 |  |  |                     // 跳转到选择的位置 | 
 |  |  |                     mWebView.evaluateJavascript( | 
 |  |  |                             String.format("javascript:setCenterAndZoom(\"%s\",\"%s\",\"17\")", | 
 |  |  |                                     item.getLng(), | 
 |  |  |                                     item.getLat()), | 
 |  |  |                             null | 
 |  |  |                     ); | 
 |  |  |                 }); | 
 |  |  |  | 
 |  |  |                 // 执行搜索 | 
 |  |  |                 compositeDisposable.add( | 
 |  |  |                         DaoSingleton.getAsynchInstance(requireContext()) | 
 |  |  |                                 .divideDao() | 
 |  |  |                                 .searchAllByKeyword(s) | 
 |  |  |                                 .subscribeOn(Schedulers.io()) | 
 |  |  |                                 .observeOn(AndroidSchedulers.mainThread()) | 
 |  |  |                                 .subscribe( | 
 |  |  |                                         results -> { | 
 |  |  |                                             if (results != null && !results.isEmpty()) { | 
 |  |  |                                                 searchDialog.setData(results); | 
 |  |  |                                                 searchDialog.show(); | 
 |  |  |                                             } else { | 
 |  |  |                                                 ToastUtil.showToast(requireContext(), "未找到相关结果"); | 
 |  |  |                                             } | 
 |  |  |                                         }, | 
 |  |  |                                         throwable -> { | 
 |  |  |                                             ToastUtil.showToast(requireContext(), "搜索失败:" + throwable.getMessage()); | 
 |  |  |                                         } | 
 |  |  |                                 ) | 
 |  |  |                 ); | 
 |  |  |             } | 
 |  |  |             return null; | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 显示取水口详情 | 
 |  |  |      * | 
 |  |  |      * @param data | 
 |  |  |      */ | 
 |  |  |     public void showWaterIntakeDetail(String data) { | 
 |  |  |         MyLog.i(data); | 
 |  |  |         binding.bottomLL.setVisibility(View.VISIBLE); | 
 |  |  |         MarkerBean markerBean = markerBeanSet.get(data); | 
 |  |  |         if (markerBean != null) { | 
 |  |  |             getInstakeDetail(markerBean); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 显示分水房详情 | 
 |  |  |      * | 
 |  |  |      * @param data | 
 |  |  |      */ | 
 |  |  |     public void showDivideDetail(String data) { | 
 |  |  |         MyLog.i(data); | 
 |  |  |         DivideBean markerBean = divideBeanMap.get(data); | 
 |  |  |         if (markerBean != null) { | 
 |  |  |             binding.bottomLL.setVisibility(View.GONE); | 
 |  |  |             getDivideDetail(markerBean); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取地图中心点 | 
 |  |  |      */ | 
 |  |  |     private void getCenterPoint() { | 
 |  |  |  | 
 |  |  |         ApiManager.getInstance().requestGet(this.getContext(), Constants.BASE_URL + "/base/dict_item/map_center", CenterPointResult.class, null, new SubscriberListener<BaseResponse<CenterPointResult>>() { | 
 |  |  |         ApiManager.getInstance().requestGetHideLoading(this.getContext(), Constants.BASE_URL + "/base/dict_item/map_center", CenterPointResult.class, null, new SubscriberListener<BaseResponse<CenterPointResult>>() { | 
 |  |  |             @Override | 
 |  |  |             public void onNext(BaseResponse<CenterPointResult> t) { | 
 |  |  |                 if (t.isSuccess()) { | 
 |  |  | 
 |  |  |                     centerPointBean.setLat(t.getContent().getLat()); | 
 |  |  |                     centerPointBean.setLng(t.getContent().getLng()); | 
 |  |  |                     centerPointBean.setZoomMp(t.getContent().getZoomMp()); | 
 |  |  |                     DaoSingleton.getInstance(MapFragment.this.getContext()).centerPointDao().deleteAll(); | 
 |  |  |                     DaoSingleton.getInstance(MapFragment.this.getContext()).centerPointDao().insert(centerPointBean); | 
 |  |  |                     jumpCenterPoint(); | 
 |  |  |                 } else { | 
 |  |  | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 隐藏底部布局的动画效果 | 
 |  |  |      */ | 
 |  |  |     private void hideBottomLayoutWithAnimation() { | 
 |  |  |         binding.bottomLL.animate() | 
 |  |  |                 .translationY(binding.bottomLL.getHeight()) | 
 |  |  |                 .setDuration(300) | 
 |  |  |                 .setInterpolator(new android.view.animation.AccelerateInterpolator()) | 
 |  |  |                 .withEndAction(() -> { | 
 |  |  |                     binding.bottomLL.setVisibility(View.GONE); | 
 |  |  |                     binding.bottomLL.setTranslationY(0); | 
 |  |  |                 }) | 
 |  |  |                 .start(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void closeWaterIntakeDetail() { | 
 |  |  |         binding.bottomLL.setVisibility(View.GONE); | 
 |  |  |         hideBottomLayoutWithAnimation(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 上报巡检记录 | 
 |  |  |      */ | 
 |  |  |     private void pushLocationData(InspectionLocationBean inspectionLocationBean) { | 
 |  |  |         InspectionRequest inspectionRequest = InspectionRequest.getInstance(); | 
 |  |  |         inspectionRequest.setInspectId(inspectionLocationBean.getInspectId()); | 
 |  |  |         inspectionRequest.setInspectorId(mInspectionBean.getInspectorId()); | 
 |  |  |         if (mInspectionBean != null) { | 
 |  |  | 
 |  |  |         track.setLat(inspectionLocationBean.getLat()); | 
 |  |  |         track.setLng(inspectionLocationBean.getLng()); | 
 |  |  |         track.setLocateTime(inspectionLocationBean.getLocateTime()); | 
 |  |  |         inspectionRequest.getTracks().clear(); | 
 |  |  |         inspectionRequest.addTracks(track); | 
 |  |  |         ApiManager.getInstance().requestPostHideLoading(MapFragment.this.getContext(), BASE_URL + "/app/inspect/save", InsectionResult.class, inspectionRequest.toMap(inspectionRequest), new SubscriberListener<BaseResponse<List<InsectionResult>>>() { | 
 |  |  |             @Override | 
 |  |  | 
 |  |  |                 try { | 
 |  |  |                     if (t.isSuccess()) { | 
 |  |  |                         if (t.getContent() != null) { | 
 |  |  |                             MyLog.d("InspectId:" + String.valueOf(t.getContent().get(0).getInspectId())); | 
 |  |  |                             mInspectionBean.setInspectId(String.valueOf(t.getContent().get(0).getInspectId())); | 
 |  |  |                             InspectionUtils.upataInspectionData(MapFragment.this.getContext(), mInspectionBean); | 
 |  |  |                         } | 
 |  |  | 
 |  |  |                     lastLatLonBean = latLonBean; | 
 |  |  |                     Log.i("chageInspecState", "lat:" + latLonBean.getLatitude() + ",log:" + latLonBean.getLongitude()); | 
 |  |  |                     InspectionLocationBean inspectionLocationBean = InspectionUtils.createInspectionLocation(latLonBean, mInspectionBean); | 
 |  |  |                     //添加巡检记录坐标 | 
 |  |  |                     InspectionUtils.addInspectionLocationData(MapFragment.this.getContext(), inspectionLocationBean); | 
 |  |  |                     //更新到地图 | 
 |  |  |                     mWebView.evaluateJavascript("javascript:updateInspectionLocation(\"" + latLonBean.getLongitude() + "\",\"" + latLonBean.getLatitude() + "\")", value -> { | 
 |  |  | 
 |  |  |      * @param inspectionState | 
 |  |  |      */ | 
 |  |  |     private void chageInspecState(int inspectionState) { | 
 |  |  |         Intent location = new Intent(this.getActivity(), MyLocationService.class); | 
 |  |  |         location.putExtra("isSingle", false); | 
 |  |  |  | 
 |  |  |         //0没有开始,1开始,2暂停,3关闭 | 
 |  |  |         switch (inspectionState) { | 
 |  |  |             case InspectionUtils.NO_INSPECTION: | 
 |  |  | 
 |  |  |                 binding.inspectButton.setText("巡"); | 
 |  |  |                 LiveEventBus.get(CommonKeyName.locationData).removeObserver(locationObserver); | 
 |  |  |                 //关闭定位 | 
 |  |  |                 this.getActivity().stopService(location); | 
 |  |  |                 ServiceUtils.stopLocationService(MapFragment.this.getContext()); | 
 |  |  |                 break; | 
 |  |  |             case InspectionUtils.STAT_INSPECTION_ONCLICK: | 
 |  |  |                 //添加新的巡检记录 | 
 |  |  |                 mInspectionBean = InspectionUtils.startInspection(this.getContext()); | 
 |  |  |                 startLocation(location); | 
 |  |  |                 startLocation(); | 
 |  |  |                 break; | 
 |  |  |             case InspectionUtils.STAT_INSPECTION://1开始 | 
 |  |  |  | 
 |  |  |                 startLocation(location); | 
 |  |  |                 startLocation(); | 
 |  |  |                 break; | 
 |  |  |             case InspectionUtils.PAUSE_INSPECTION://暂停 | 
 |  |  |                 try { | 
 |  |  |                     //关闭定位 | 
 |  |  |                     this.getActivity().stopService(location); | 
 |  |  |                     ServiceUtils.stopLocationService(MapFragment.this.getContext()); | 
 |  |  |                     binding.stateText.setText("已暂停巡检"); | 
 |  |  |                     binding.inspectPause.setText("继续"); | 
 |  |  |                     binding.inspectRL.setBackgroundColor(this.getContext().getResources().getColor(R.color.inspect_rl_bg_color)); | 
 |  |  | 
 |  |  |      * 意外退出后继续显示之前的坐标 | 
 |  |  |      */ | 
 |  |  |     public void aginShowLocation(List<InspectionLocationBean> locationBeans) { | 
 |  |  |         isHaseAginData = true; | 
 |  |  |         if (locationBeans != null) { | 
 |  |  |             aginShowlocationBeans = locationBeans; | 
 |  |  |         } | 
 |  |  | 
 |  |  |                     }); | 
 |  |  |                 } | 
 |  |  |                 // 向 WebView 注入数据 | 
 |  |  |  | 
 |  |  |                 aginShowlocationBeans.clear(); | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 跳转地图中心点 | 
 |  |  |      */ | 
 |  |  |     public void jumpCenterPoint() { | 
 |  |  |         if (webViewIsFinished) { | 
 |  |  |             if (centerPointBean != null) { | 
 |  |  |                 Log.d(TAG, "jumpCenterPoint>>>>>>>>>>>>>>>>>>>" + centerPointBean.getLng() + "\",\"" + centerPointBean.getLat()); | 
 |  |  |                 mWebView.evaluateJavascript("javascript:setCenterAndZoom(\"" + centerPointBean.getLng() + "\",\"" + centerPointBean.getLat() + "\",\"" + centerPointBean.getZoomMp() + "\")", value -> { | 
 |  |  |                 }); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 添加取水口 | 
 |  |  |      */ | 
 |  |  |     public void setMapMarker(MarkerBean markerBean) { | 
 |  |  |         if (markerBean != null) { | 
 |  |  |             if (webViewIsFinished) { | 
 |  |  |                 if (!TextUtils.isEmpty(markerBean.getLng()) && !TextUtils.isEmpty(markerBean.getLat())) { | 
 |  |  |                     mWebView.evaluateJavascript("javascript:addMarker(\"" + markerBean.getId() + "\",\"" + markerBean.getLng() + "\",\"" + markerBean.getLat() + "\",\"" + markerBean.getName() + "\",\"" + isShowMarker + "\")", new ValueCallback<String>() { | 
 |  |  |                         @Override | 
 |  |  |                         public void onReceiveValue(String value) { | 
 |  |  |                         } | 
 |  |  |                     }); | 
 |  |  |                     markerBeanSet.put(markerBean.getId(), markerBean); | 
 |  |  |                 } else { | 
 |  |  |                     MyLog.d("setMapMarker>" + markerBean.getName() + "经纬度为空"); | 
 |  |  |                 } | 
 |  |  |             } else { | 
 |  |  |                 webNoFinishMarkerData.add(markerBean); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 添加分水房 | 
 |  |  |      */ | 
 |  |  |     public void setMapDivide(DivideBean divide) { | 
 |  |  |         if (divide != null) { | 
 |  |  |             if (webViewIsFinished) { | 
 |  |  |                 if (!TextUtils.isEmpty(divide.getLng()) && !TextUtils.isEmpty(divide.getLat())) { | 
 |  |  |                     mWebView.evaluateJavascript("javascript:addDivide(\"" + divide.getId() + "\",\"" + divide.getLng() + "\",\"" + divide.getLat() + "\",\"" + divide.getDivideName() + "\",\"" + isShowDivide + "\")", new ValueCallback<String>() { | 
 |  |  |                         @Override | 
 |  |  |                         public void onReceiveValue(String value) { | 
 |  |  |                         } | 
 |  |  |                     }); | 
 |  |  |                     divideBeanMap.put(divide.getId(), divide); | 
 |  |  |                 } else { | 
 |  |  |                     MyLog.d("setMapDivide>" + divide.getDivideName() + "经纬度为空"); | 
 |  |  |                 } | 
 |  |  |             } else { | 
 |  |  |                 webNoFinishDivideData.add(divide); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 添加管网标注 | 
 |  |  |      */ | 
 |  |  |     public void setMapPipe(PipeNetworkBean pipeNetworkBean) { | 
 |  |  |         if (pipeNetworkBean != null) { | 
 |  |  |             if (webViewIsFinished) { | 
 |  |  |                 boolean isfrist = true; | 
 |  |  |                 for (PipeNetworkDataCoordinateBean data : pipeNetworkBean.getData().getCoordinates()) { | 
 |  |  |                     if (!TextUtils.isEmpty(data.getLat()) && !TextUtils.isEmpty(data.getLng())) { | 
 |  |  |                         mWebView.evaluateJavascript("javascript:addPipeNetwork(\"" + data.getLng() + "\",\"" + data.getLat() + "\",\"" + isfrist + "\",\"" + isShowPipeNetwork + "\")", new ValueCallback<String>() { | 
 |  |  |                             @Override | 
 |  |  |                             public void onReceiveValue(String value) { | 
 |  |  |                             } | 
 |  |  |                         }); | 
 |  |  |                         isfrist = false; | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } else { | 
 |  |  |                 webNoFinishPipeNetworkData.add(pipeNetworkBean); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 开始巡检的相关逻辑 | 
 |  |  |      * | 
 |  |  |      * @param location | 
 |  |  |      * @param | 
 |  |  |      */ | 
 |  |  |     private void startLocation(Intent location) { | 
 |  |  |     private void startLocation() { | 
 |  |  |         //获取定位服务传过来的坐标点 | 
 |  |  |         LiveEventBus.get(CommonKeyName.locationData).observeForever(locationObserver); | 
 |  |  |         LiveEventBus.get(CommonKeyName.locationData).observe(this, locationObserver); | 
 |  |  |         binding.inspectRL.setVisibility(View.VISIBLE); | 
 |  |  |         binding.inspectButton.setVisibility(View.GONE); | 
 |  |  |         binding.inspectPause.setText("暂停"); | 
 |  |  |         binding.stateText.setText("已开启巡检"); | 
 |  |  |         binding.inspectRL.setBackgroundColor(this.getContext().getResources().getColor(R.color.base_blue)); | 
 |  |  |         //开启定位 | 
 |  |  |         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { | 
 |  |  |             this.getActivity().startForegroundService(location); | 
 |  |  |         } else { | 
 |  |  |             this.getActivity().startService(location); | 
 |  |  |         } | 
 |  |  |         inspectionRequest = new InspectionRequest(); | 
 |  |  |         SharedPreferencesHelper.getInstance(this.getContext()).put(CommonKeyName.inspectionState, InspectionUtils.STAT_INSPECTION); | 
 |  |  |         ServiceUtils.startLocationService(MapFragment.this.getContext(), false); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 
 |  |  |             e.printStackTrace(); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 接收js传来的中心点坐标 | 
 |  |  |      * | 
 |  |  |      * @param lng | 
 |  |  |      * @param lat | 
 |  |  |      */ | 
 |  |  |     public void refreshCenterPoint(double lng, double lat) { | 
 |  |  |         centerLng = lng; | 
 |  |  |         centerLat = lat; | 
 |  |  |         binding.pointText.setText(centerLng + "," + centerLat); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 修改经纬度 | 
 |  |  |      * | 
 |  |  |      * @param markerBean | 
 |  |  |      */ | 
 |  |  |     private void updataInstake(MarkerBean markerBean) { | 
 |  |  |         String lng = String.valueOf(centerLng); | 
 |  |  |         String lat = String.valueOf(centerLat); | 
 |  |  |         Map<String, Object> params = new HashMap<>(); | 
 |  |  |         params.put("id", markerBean.getId()); | 
 |  |  |         params.put("lng", lng); | 
 |  |  |         params.put("lat", lat); | 
 |  |  |         params.put("operator", MyApplication.myApplication.userId); | 
 |  |  |  | 
 |  |  |         ApiManager.getInstance().requestPost(MapFragment.this.getContext(), BASE_URL + "/project/intake/updateIntakeLngLat", Boolean.class, params, new SubscriberListener<BaseResponse<Boolean>>() { | 
 |  |  |             @Override | 
 |  |  |             public void onNext(BaseResponse<Boolean> t) { | 
 |  |  |                 try { | 
 |  |  |                     if (t.isSuccess()) { | 
 |  |  |                         mWebView.evaluateJavascript("javascript:refreshMarker(\"" + markerBean.getId() + "\",\"" + centerLng + "\",\"" + centerLat + "\",\"" + markerBean.getName() + "\")", new ValueCallback<String>() { | 
 |  |  |                             @Override | 
 |  |  |                             public void onReceiveValue(String value) { | 
 |  |  |                             } | 
 |  |  |                         }); | 
 |  |  |                         binding.pointCenterImg.setVisibility(View.GONE); | 
 |  |  |                         binding.pointRL.setVisibility(View.GONE); | 
 |  |  |                         mMarkerBean.setLat(lat); | 
 |  |  |                         mMarkerBean.setLng(lng); | 
 |  |  |                         binding.lng.setText(lng); | 
 |  |  |                         binding.lat.setText(lat); | 
 |  |  |                         mWebView.evaluateJavascript("javascript:cancelPin()", value -> { | 
 |  |  |                         }); | 
 |  |  |  | 
 |  |  |                         // 更新本地数据库 | 
 |  |  |                         compositeDisposable.add( | 
 |  |  |                                 DaoSingleton.getAsynchInstance(MapFragment.this.getContext()) | 
 |  |  |                                         .markerDao() | 
 |  |  |                                         .updateMarkerLocation(markerBean.getId(), lng, lat) | 
 |  |  |                                         .subscribeOn(Schedulers.io()) | 
 |  |  |                                         .observeOn(AndroidSchedulers.mainThread()) | 
 |  |  |                                         .subscribe( | 
 |  |  |                                                 () -> { | 
 |  |  |                                                     // 更新本地缓存Map中的数据 | 
 |  |  |                                                     MarkerBean cachedMarker = markerBeanSet.get(markerBean.getId()); | 
 |  |  |                                                     if (cachedMarker != null) { | 
 |  |  |                                                         cachedMarker.setLng(lng); | 
 |  |  |                                                         cachedMarker.setLat(lat); | 
 |  |  |                                                     } | 
 |  |  |                                                     ToastUtil.showToastLong(MapFragment.this.getContext(), "修改成功!"); | 
 |  |  |                                                 }, | 
 |  |  |                                                 throwable -> { | 
 |  |  |                                                     Log.e(TAG, "更新本地数据库失败: "); | 
 |  |  |                                                     ToastUtil.showToastLong(MapFragment.this.getContext(), "修改成功,但本地数据库更新失败"); | 
 |  |  |                                                 } | 
 |  |  |                                         ) | 
 |  |  |                         ); | 
 |  |  |  | 
 |  |  |                     } else { | 
 |  |  |                         ToastUtil.showToastLong(MapFragment.this.getContext(), t.getMsg()); | 
 |  |  |                     } | 
 |  |  |                 } catch (Exception e) { | 
 |  |  |                     e.printStackTrace(); | 
 |  |  |                     CrashReport.postCatchedException(e); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取取水口详情 | 
 |  |  |      * | 
 |  |  |      * @param markerBean | 
 |  |  |      */ | 
 |  |  |     private void getInstakeDetail(MarkerBean markerBean) { | 
 |  |  |         Map<String, Object> params = new HashMap<>(); | 
 |  |  |         params.put("id", markerBean.getId()); | 
 |  |  |         ApiManager.getInstance().requestGet(this.getContext(), Constants.BASE_URL + "/project/intake/one", MarkerResult.class, params, new SubscriberListener<BaseResponse<MarkerResult>>() { | 
 |  |  |             @Override | 
 |  |  |             public void onNext(BaseResponse<MarkerResult> t) { | 
 |  |  |                 if (t.isSuccess()) { | 
 |  |  |                     MarkerResult result = t.getContent(); | 
 |  |  |                     mMarkerBean = new MarkerBean(); | 
 |  |  |                     mMarkerBean.setId(result.getId()); | 
 |  |  |                     mMarkerBean.setLng(result.getLng()); | 
 |  |  |                     mMarkerBean.setLat(result.getLat()); | 
 |  |  |                     mMarkerBean.setBlockId(result.getBlockId()); | 
 |  |  |                     mMarkerBean.setName(result.getName()); | 
 |  |  |                     mMarkerBean.setRemarks(result.getRemarks()); | 
 |  |  |                     mMarkerBean.setTownId(result.getTownId()); | 
 |  |  |                     mMarkerBean.setVillageId(result.getVillageId()); | 
 |  |  |                     mMarkerBean.setCountyId(result.getCountyId()); | 
 |  |  |                     mMarkerBean.setAddress(result.getAddress()); | 
 |  |  |                     mMarkerBean.setBlockName(result.getBlockName()); | 
 |  |  |                     mMarkerBean.setDivideId(result.getDivideId()); | 
 |  |  |                     getDeviceData(result.getName()); | 
 |  |  |                     showMarker(mMarkerBean); | 
 |  |  |                 } else { | 
 |  |  |                     ToastUtil.showToast(MapFragment.this.getContext(), t.getMsg()); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 显示分水房详情 | 
 |  |  |      */ | 
 |  |  |     private void getDivideDetail(DivideBean divideBean) { | 
 |  |  |         ApiManager.getInstance().requestGet(this.getContext(), Constants.BASE_URL + "/project/divide/getone/" + divideBean.getDivideId(), DivideResult.class, null, new SubscriberListener<BaseResponse<DivideResult>>() { | 
 |  |  |             @Override | 
 |  |  |             public void onNext(BaseResponse<DivideResult> t) { | 
 |  |  |                 if (t.isSuccess()) { | 
 |  |  |                     DivideBean divideBean = getDivideBean(t.getContent()); | 
 |  |  |                     getDeviceData(divideBean.getDivideName()); | 
 |  |  |                     showDivideMarker(divideBean); | 
 |  |  |                 } else { | 
 |  |  |                     ToastUtil.showToast(MapFragment.this.getContext(), t.getMsg()); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 显示底部布局的动画效果 | 
 |  |  |      */ | 
 |  |  |     private void showBottomLayoutWithAnimation() { | 
 |  |  |         binding.bottomLL.setVisibility(View.VISIBLE); | 
 |  |  |         binding.bottomLL.setTranslationY(binding.bottomLL.getHeight()); | 
 |  |  |         binding.bottomLL.animate() | 
 |  |  |                 .translationY(0) | 
 |  |  |                 .setDuration(300) | 
 |  |  |                 .setInterpolator(new android.view.animation.DecelerateInterpolator()) | 
 |  |  |                 .start(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 显示取水口详情 | 
 |  |  |      */ | 
 |  |  |     private void showMarker(MarkerBean markerBean) { | 
 |  |  |         showBottomLayoutWithAnimation(); | 
 |  |  |         binding.phoneLL.setVisibility(View.GONE); | 
 |  |  |         binding.headerLL.setVisibility(View.GONE); | 
 |  |  |         binding.editePoint.setVisibility(View.VISIBLE); | 
 |  |  |         binding.markerAddress.setText(markerBean.getAddress()); | 
 |  |  |         binding.markerName.setText(markerBean.getName()); | 
 |  |  |         binding.markerBlockName.setText(markerBean.getBlockName()); | 
 |  |  |         binding.lat.setText(markerBean.getLat()); | 
 |  |  |         binding.lng.setText(markerBean.getLng()); | 
 |  |  |         //修改经纬度 | 
 |  |  |         binding.editePoint.setOnClickListener(v -> { | 
 |  |  |  | 
 |  |  |             mWebView.evaluateJavascript("javascript:showPin(\"" + markerBean.getLng() + "\",\"" + markerBean.getLat() + "\")", value -> { | 
 |  |  |                 binding.pointRL.setVisibility(View.VISIBLE); | 
 |  |  |                 binding.pointCenterImg.setVisibility(View.VISIBLE); | 
 |  |  |                 MyLog.d("showPin>>" + value); | 
 |  |  |             }); | 
 |  |  |  | 
 |  |  |         }); | 
 |  |  |         //取消修改经纬度 | 
 |  |  |         binding.pointCancel.setOnClickListener(v -> { | 
 |  |  |                     binding.pointCenterImg.setVisibility(View.GONE); | 
 |  |  |                     binding.pointRL.setVisibility(View.GONE); | 
 |  |  |                     mWebView.evaluateJavascript("javascript:cancelPin()", value -> { | 
 |  |  |  | 
 |  |  |                     }); | 
 |  |  |                 } | 
 |  |  |         ); | 
 |  |  |         //确认修改经纬度 | 
 |  |  |         binding.pointEdt.setOnClickListener(v -> { | 
 |  |  |             ConfirmDialog confirmDialog = new ConfirmDialog(MapFragment.this.getActivity(), "确认修改到该位置吗?", (confirmDialog1, v1) -> { | 
 |  |  |                 confirmDialog1.dismiss(); | 
 |  |  |                 updataInstake(markerBean); | 
 |  |  |             }); | 
 |  |  |             confirmDialog.show(); | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 显示分水房详情 | 
 |  |  |      * | 
 |  |  |      * @param divideBean | 
 |  |  |      */ | 
 |  |  |     private void showDivideMarker(DivideBean divideBean) { | 
 |  |  |         showBottomLayoutWithAnimation(); | 
 |  |  |         binding.phoneLL.setVisibility(View.VISIBLE); | 
 |  |  |         binding.headerLL.setVisibility(View.VISIBLE); | 
 |  |  |         binding.editePoint.setVisibility(View.GONE); | 
 |  |  |         binding.markerAddress.setText(divideBean.getAddress()); | 
 |  |  |         binding.markerName.setText(divideBean.getDivideName()); | 
 |  |  |         binding.markerBlockName.setText(divideBean.getBlockName()); | 
 |  |  |         binding.phone.setText(divideBean.getPhone()); | 
 |  |  |         binding.phone.setOnClickListener(v -> { | 
 |  |  |             Intent intent = new Intent(Intent.ACTION_DIAL); | 
 |  |  |             intent.setData(Uri.parse("tel:" + divideBean.getPhone())); | 
 |  |  |             startActivity(intent); | 
 |  |  |         }); | 
 |  |  |         binding.header.setText(divideBean.getHeader()); | 
 |  |  |         binding.lat.setText(divideBean.getLat()); | 
 |  |  |         binding.lng.setText(divideBean.getLng()); | 
 |  |  |         //修改经纬度 | 
 |  |  |         binding.editePoint.setOnClickListener(v -> { | 
 |  |  |  | 
 |  |  |             mWebView.evaluateJavascript("javascript:showPin(\"" + divideBean.getLng() + "\",\"" + divideBean.getLat() + "\")", value -> { | 
 |  |  |                 binding.pointRL.setVisibility(View.VISIBLE); | 
 |  |  |                 binding.pointCenterImg.setVisibility(View.VISIBLE); | 
 |  |  |                 MyLog.d("showPin>>" + value); | 
 |  |  |             }); | 
 |  |  |  | 
 |  |  |         }); | 
 |  |  |         //取消修改经纬度 | 
 |  |  |         binding.pointCancel.setOnClickListener(v -> { | 
 |  |  |                     binding.pointCenterImg.setVisibility(View.GONE); | 
 |  |  |                     binding.pointRL.setVisibility(View.GONE); | 
 |  |  |                     mWebView.evaluateJavascript("javascript:cancelPin()", value -> { | 
 |  |  |  | 
 |  |  |                     }); | 
 |  |  |                 } | 
 |  |  |         ); | 
 |  |  |         //确认修改经纬度 | 
 |  |  |         binding.pointEdt.setOnClickListener(v -> { | 
 |  |  |             ConfirmDialog confirmDialog = new ConfirmDialog(MapFragment.this.getActivity(), "确认修改到该位置吗?", (confirmDialog1, v1) -> { | 
 |  |  |                 confirmDialog1.dismiss(); | 
 |  |  | //                updataInstake(markerBean); | 
 |  |  |             }); | 
 |  |  |             confirmDialog.show(); | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取分水房 | 
 |  |  |      */ | 
 |  |  |     private void getDivideList() { | 
 |  |  |         ApiManager.getInstance().requestGetHideLoading(MapFragment.this.getContext(), BASE_URL + "/project/divide/getDivides", DivideListResult.class, null, new SubscriberListener<BaseResponse<DivideListResult>>() { | 
 |  |  |             @Override | 
 |  |  |             public void onNext(BaseResponse<DivideListResult> t) { | 
 |  |  |                 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); | 
 |  |  |                             } | 
 |  |  |                             DaoSingleton.getInstance(MapFragment.this.getContext()).divideDao().deleteAll(); | 
 |  |  |                             // 使用 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()); | 
 |  |  |                     } | 
 |  |  |                 } catch (Exception e) { | 
 |  |  |                     e.printStackTrace(); | 
 |  |  |                     CrashReport.postCatchedException(e); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取管网 | 
 |  |  |      */ | 
 |  |  |     private void getPipeNetworkList() { | 
 |  |  |         ApiManager.getInstance().requestGetHideLoading(MapFragment.this.getContext(), BASE_URL + "/project/network/all", PipeNetworkResult.class, null, new SubscriberListener<BaseResponse<List<PipeNetworkResult>>>() { | 
 |  |  |             @Override | 
 |  |  |             public void onNext(BaseResponse<List<PipeNetworkResult>> t) { | 
 |  |  |                 try { | 
 |  |  |                     if (t.isSuccess()) { | 
 |  |  |                         if (t.getContent() != null && t.getContent().size() > 0) { | 
 |  |  |  | 
 |  |  |                             List<PipeNetworkBean> pipeNetBeans = new ArrayList<>(); | 
 |  |  |  | 
 |  |  |                             for (PipeNetworkResult pipeNetworkResult : t.getContent()) { | 
 |  |  |                                 PipeNetworkBean pipeNetBean = new PipeNetworkBean(); | 
 |  |  |                                 pipeNetBean.setNetworkId(pipeNetworkResult.getNetworkId()); | 
 |  |  |                                 pipeNetBean.setType(pipeNetworkResult.getType()); | 
 |  |  |                                 PipeNetWorkDataBean data = new PipeNetWorkDataBean(); | 
 |  |  |                                 data.setType(pipeNetworkResult.getData().getType()); | 
 |  |  |                                 List<PipeNetworkDataCoordinateBean> coordinates = new ArrayList<>(); | 
 |  |  |                                 for (PipeNetworkResult.Data.Coordinate dataBean : pipeNetworkResult.getData().getCoordinates()) { | 
 |  |  |                                     PipeNetworkDataCoordinateBean coordinate = new PipeNetworkDataCoordinateBean(); | 
 |  |  |                                     coordinate.setLat(dataBean.getLat()); | 
 |  |  |                                     coordinate.setLng(dataBean.getLng()); | 
 |  |  |                                     coordinates.add(coordinate); | 
 |  |  |                                 } | 
 |  |  |                                 data.setCoordinates(coordinates); | 
 |  |  |                                 pipeNetBean.setData(data); | 
 |  |  |                                 setMapPipe(pipeNetBean); | 
 |  |  |                                 pipeNetBeans.add(pipeNetBean); | 
 |  |  |                             } | 
 |  |  |  | 
 |  |  |                             DaoSingleton.getInstance(MapFragment.this.getContext()).pipeNetDao().deleteAll(); | 
 |  |  |                             // 使用 RxJava 异步插入数据 | 
 |  |  |                             compositeDisposable.add( | 
 |  |  |                                     DaoSingleton.getAsynchInstance(MapFragment.this.getContext()).pipeNetDao().insertAll(pipeNetBeans) | 
 |  |  |                                             .subscribeOn(Schedulers.io()) // 在 IO 线程上执行 | 
 |  |  |                                             .observeOn(AndroidSchedulers.mainThread()) // 在主线程上观察 | 
 |  |  |                                             .subscribe(() -> { | 
 |  |  |                                                 // 插入成功 | 
 |  |  |                                                 Log.i("mWebView", "数据插入成功"); | 
 |  |  |                                             }, throwable -> { | 
 |  |  |                                                 // 插入失败 | 
 |  |  |                                                 Log.e("mWebView", "数据插入失败: " + throwable.getMessage()); | 
 |  |  |                                             }) | 
 |  |  |                             ); | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |                     } else { | 
 |  |  |                         ToastUtil.showToastLong(MapFragment.this.getContext(), t.getMsg()); | 
 |  |  |                     } | 
 |  |  |                 } catch (Exception e) { | 
 |  |  |                     e.printStackTrace(); | 
 |  |  |                     CrashReport.postCatchedException(e); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * @param divideResult | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     private static @NonNull DivideBean getDivideBean(DivideResult divideResult) { | 
 |  |  |         DivideBean divideBean = new DivideBean(); | 
 |  |  |         divideBean.setAddress(divideResult.getAddress()); | 
 |  |  |         divideBean.setBlockId(divideResult.getBlockId()); | 
 |  |  |         divideBean.setBlockName(divideResult.getBlockName()); | 
 |  |  |         divideBean.setDivideId(divideResult.getDivideId()); | 
 |  |  |         if (!TextUtils.isEmpty(divideResult.getDivideName())) { | 
 |  |  |             divideBean.setDivideName(divideResult.getDivideName()); | 
 |  |  |         } else { | 
 |  |  |             divideBean.setDivideName(divideResult.getName()); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         divideBean.setHeader(divideResult.getHeader()); | 
 |  |  |         divideBean.setId(divideResult.getId()); | 
 |  |  |         divideBean.setLat(divideResult.getLat()); | 
 |  |  |         divideBean.setLng(divideResult.getLng()); | 
 |  |  |         divideBean.setOperateDt(divideResult.getOperateDt()); | 
 |  |  |         divideBean.setOperator(divideResult.getOperator()); | 
 |  |  |         divideBean.setPhone(divideResult.getPhone()); | 
 |  |  |         divideBean.setRemarks(divideResult.getRemarks()); | 
 |  |  |         divideBean.setVillages(divideResult.getVillages()); | 
 |  |  |         divideBean.setArea(divideResult.getArea()); | 
 |  |  |         return divideBean; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private static @NonNull PipeNetworkBean getPipeNetworkBean(PipeNetworkResult divideResult) { | 
 |  |  |         PipeNetworkBean pipeNetworkBean = new PipeNetworkBean(); | 
 |  |  |  | 
 |  |  |         return pipeNetworkBean; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public void onDestroy() { | 
 |  |  |         super.onDestroy(); | 
 |  |  |         // 清理所有订阅 | 
 |  |  |         if (compositeDisposable != null && !compositeDisposable.isDisposed()) { | 
 |  |  |             compositeDisposable.dispose(); | 
 |  |  |         } | 
 |  |  |         LiveEventBus.get(CommonKeyName.locationData).removeObserver(locationObserver); | 
 |  |  |         if (mWebView != null) { | 
 |  |  |             mWebView.destroy(); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public void onResume() { | 
 |  |  |         super.onResume(); | 
 |  |  |         mWebView.onResume(); | 
 |  |  |         mWebView.resumeTimers(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public void onPause() { | 
 |  |  |         super.onPause(); | 
 |  |  |         mWebView.onPause(); | 
 |  |  |         mWebView.pauseTimers(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public void onSaveInstanceState(@NonNull Bundle outState) { | 
 |  |  |         super.onSaveInstanceState(outState); | 
 |  |  |         mWebView.saveState(outState); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public void onViewStateRestored(@Nullable Bundle savedInstanceState) { | 
 |  |  |         super.onViewStateRestored(savedInstanceState); | 
 |  |  |         if (savedInstanceState != null) { | 
 |  |  |             mWebView.restoreState(savedInstanceState); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 显示或隐藏地图上的取水口 | 
 |  |  |      * | 
 |  |  |      * @param isShow | 
 |  |  |      */ | 
 |  |  |     private void showMarkers(boolean isShow) { | 
 |  |  |         if (isShow) { | 
 |  |  |             mWebView.evaluateJavascript("javascript:showAllWaterIntakes()", value -> { | 
 |  |  |             }); | 
 |  |  |         } else { | 
 |  |  |             mWebView.evaluateJavascript("javascript:hideAllWaterIntakes()", value -> { | 
 |  |  |             }); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 显示或隐藏地图上的分水房 | 
 |  |  |      * | 
 |  |  |      * @param isShow | 
 |  |  |      */ | 
 |  |  |     private void showDivideMarkers(boolean isShow) { | 
 |  |  |         if (isShow) { | 
 |  |  |             mWebView.evaluateJavascript("javascript:showAllDivides()", value -> { | 
 |  |  |             }); | 
 |  |  |         } else { | 
 |  |  |             mWebView.evaluateJavascript("javascript:hideAllDivides()", value -> { | 
 |  |  |             }); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void showPipeLine(boolean isSelected) { | 
 |  |  |         if (isSelected) { | 
 |  |  |             mWebView.evaluateJavascript("javascript:showAllPipeLines()", value -> { | 
 |  |  |             }); | 
 |  |  |         } else { | 
 |  |  |             mWebView.evaluateJavascript("javascript:hideAllPipeLines()", value -> { | 
 |  |  |             }); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取设备相关状态信息 | 
 |  |  |      * | 
 |  |  |      * @param intakeNum | 
 |  |  |      */ | 
 |  |  |     private void getDeviceData(String intakeNum) { | 
 |  |  |         Map<String, Object> params = new HashMap<>(); | 
 |  |  |         params.put("intakeNum", intakeNum); | 
 |  |  |         ApiManager.getInstance().requestGetHideLoading(MapFragment.this.getContext(), BASE_URL + "/remote/monitor/all_intakes", IntakeListResult.class, params, new SubscriberListener<BaseResponse<IntakeListResult>>() { | 
 |  |  |             @Override | 
 |  |  |             public void onNext(BaseResponse<IntakeListResult> t) { | 
 |  |  |                 try { | 
 |  |  |                     if (t.isSuccess()) { | 
 |  |  |                         if (t.getContent() != null && t.getContent().getObj().size() > 0) { | 
 |  |  |                             binding.deviceStateLL.setVisibility(View.VISIBLE); | 
 |  |  |                             binding.rtuAddressLL.setVisibility(View.VISIBLE); | 
 |  |  |                             IntakeResult intakeResult = t.getContent().getObj().get(0); | 
 |  |  |                             if (intakeResult.isOnLine()) { | 
 |  |  |                                 binding.deviceState.setText("在线"); | 
 |  |  |                                 binding.deviceState.setTextColor(getResources().getColor(R.color.down_green_up, null)); | 
 |  |  |                             } else { | 
 |  |  |                                 binding.deviceState.setText("离线"); | 
 |  |  |                                 binding.deviceState.setTextColor(getResources().getColor(R.color.delete_color, null)); | 
 |  |  |                             } | 
 |  |  |                             binding.rtuAddress.setText(intakeResult.getRtuAddr()); | 
 |  |  |                         } else { | 
 |  |  |                             binding.deviceStateLL.setVisibility(View.GONE); | 
 |  |  |                             binding.rtuAddressLL.setVisibility(View.GONE); | 
 |  |  |                         } | 
 |  |  |                     } else { | 
 |  |  |                         ToastUtil.showToastLong(MapFragment.this.getContext(), t.getMsg()); | 
 |  |  |                     } | 
 |  |  |                 } catch (Exception e) { | 
 |  |  |                     e.printStackTrace(); | 
 |  |  |                     CrashReport.postCatchedException(e); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } |