我使用MapView根据当前用户位置或选定的地图位置显示一些标记。问题是当我使用导航组件和返回导航到另一个片段时。下面的一些步骤两次触发livedata值。
加载流程如下:
步骤1: MapView State -当地图准备就绪(GetMapAsync)时,继续执行步骤2。
步骤2:权限状态-检查位置权限和全球定位系统设置。如果未授予权限,则请求许可。如果授予了许可并且gps可用,Livedata将触发true,否则为false。
步骤3:位置更新状态-如果权限状态为真,则从fusedLocationProvider加载requestLocationUpdates和从服务器加载数据。如果为false,则在地图上设置预定义的位置,并从服务器加载此位置的数据。
问题:
一开始它运行得很好。第一步-第三步开火一次。当我导航到另一个片段并返回时,步骤1-3触发包含来自初始加载的数据的最后一个值。但是在第1步中,我总是检查是否允许再次返回true或false。这将导致步骤2和步骤3再次加载数据,从而导致再次从服务器加载数据。
我可以在onCreate中检查权限,但是步骤1 (MapView)必须在步骤2之前准备好。
是否知道如何防止再次从服务器加载数据。我已经为第一步尝试过SingleEvent (https://proandroiddev.com/singleliveevent-to-help-you-work-with-livedata-and-events-5ac519989c70)。这很好,但是我需要再次触发mapview状态来显示一些基于mapview状态的按钮。
注意:视图模型约束每个livedata对象,并且是一个activityViewModel。每个步骤都有自己的活动数据对象。
发布于 2022-09-25 10:40:01
我现在找到了一个解决办法:
位置LatLng是从服务器加载数据的关键。每次从位置提供程序到达新位置时,都会再次调用从服务器加载数据的方法。
解决方案是,只有在位置发生变化时才加载数据。这将防止再次从服务器加载数据,并将应用livedata的最后一个值。
这会导致初始负载出现问题。最初,当GPS不可用或不授予许可时,我存储的位置和位置提供者返回的位置是相同的。因此,有必要检查是否第一次调用了该片段。如果为真,则加载数据,即使位置相同。
https://stackoverflow.com/questions/73827156
复制相似问题