android - Android MapView 导致表面更新
问题描述
我在自定义中使用MapViewFragment
,并将所有生命周期方法转发到MapView
. 我在平板电脑上遇到无限表面更新问题(即使在平板电脑模拟器上:HAXM Nexus 10 API30),但在任何手机上都没有。我删除了所有功能,除了实现所需的功能,MapView
但问题仍然存在。
这个无限表面更新导致 RecyclerView 适配器出现问题,因为 onBindViewHolder 被触发多次(~20)秒。
我想知道如何阻止这种意外行为MapView
或至少限制发送到的事件数量RecyclerView.Adapter
。
地图视图片段:
class MapIssueFragment: Fragment(R.layout.fragment_map), OnMapReadyCallback {
companion object {
private const val TAG = "MapIssueFragment"
fun newInstance(): MapIssueFragment{
return MapIssueFragment()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.i(TAG, "onCreate")
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
Log.i(TAG, "onViewCreated")
map.apply {
onCreate(savedInstanceState)
getMapAsync(this@MapIssueFragment)
}
}
override fun onStart() {
super.onStart()
map.onStart()
Log.i(TAG, "onStart")
}
override fun onResume() {
super.onResume()
map.onResume()
Log.i(TAG, "onResume")
}
override fun onPause() {
super.onPause()
map.onPause()
Log.i(TAG, "onPause")
}
override fun onStop() {
super.onStop()
map.onStop()
Log.i(TAG, "onStop")
}
override fun onDestroy() {
super.onDestroy()
map.onDestroy()
Log.i(TAG, "onDestroy")
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
map.onSaveInstanceState(outState)
Log.i(TAG, "onSaveInstanceState")
}
override fun onLowMemory() {
super.onLowMemory()
map.onLowMemory()
Log.i(TAG, "onLowMemory")
}
private lateinit var googleMap: GoogleMap
override fun onMapReady(googleMap: GoogleMap) {
this.googleMap = googleMap
}
}
片段映射:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.gms.maps.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/requirements_container"/>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/requirements_container"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHeight_percent="0.50"
android:visibility="visible"
>
<TextView
android:id="@+id/requirements_empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/no_requirements"
android:gravity="center"
android:visibility="gone"
/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/requirements_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:listitem="@layout/item_requirement_detail"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
即使没有 RecyclerView 适配器,我也可以在 Logcat 中看到错误,您可以在其中看到刷新率:
2020-10-27 13:47:50.908 E/RecyclerView: No adapter attached; skipping layout
2020-10-27 13:47:50.914 E/RecyclerView: No adapter attached; skipping layout
2020-10-27 13:47:50.963 E/RecyclerView: No adapter attached; skipping layout
2020-10-27 13:47:50.972 E/RecyclerView: No adapter attached; skipping layout
2020-10-27 13:47:51.025 E/RecyclerView: No adapter attached; skipping layout
2020-10-27 13:47:51.029 E/RecyclerView: No adapter attached; skipping layout
2020-10-27 13:47:51.075 E/RecyclerView: No adapter attached; skipping layout
2020-10-27 13:47:51.092 E/RecyclerView: No adapter attached; skipping layout
解决方案
由于这个问题,我找到了解决方法。设置MapView.layerType
为hardware
降低刷新率。这只是解决方法,而不是正确的解决方案!
<com.google.android.gms.maps.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layerType="hardware"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/map_change_size_button"/>
推荐阅读
- laravel - laravel 中“requiredIf”验证的自定义错误消息
- ros - ROS - 如何发布消息并立即获取订阅的回调
- docker - 如何通过命令行在 Debian 上构建嵌入式 Atmelstudio 项目
- unix - 在使用 Scraper wget 下载图像之前查找文件大小
- javascript - 在 DT 中添加多个无线电组
- angular - Angular:在一页上管理多个无限相同的表单
- r - 如何一次从 R 中的核密度函数中提取多个样本的数据
- c# - EntityState.Modified 以在单个语句中更新多条记录
- mongodb - Mongo-db 容器在 30 秒后关闭
- python - 使用另一个列表的索引值打印列表中的项目?