我从服务器上拿走的Google Maps v2中有超过10.000个标记,我无法将其显示在地图上,我有两种技巧。
我使用第一种方法,结果是地图停止(冻结)了几秒钟,之后出现标记,我的地图运行缓慢..
我也使用第二种方法,它比第一种方法快,但在互联网连接较弱时会变慢
从以上两种方法中,哪一种效率更高,速度更快,或者可能是通过其他方法成为我的地图以获得更好的性能?谢谢..
签出Android Map Extensions。连同@ d.aemon关于sqlite的注释,您可以使用聚类库,并根据用户在地图上的位置动态添加标记。
如果您使用的是Android Studio,则可以快速设置聚类和动态标记:
在build.gradle中(模块:应用程序):
compile 'com.androidmapsextensions:android-maps-extensions:2.2.0'
compile 'com.google.android.gms:play-services-maps:6.5.87'
在您的代码中创建地图时:
map.setClustering(new ClusteringSettings().enabled(true)
.addMarkersDynamically(true).minMarkersCount(5));
我没有您要做的标记数量,但是此库的功能远远超出了Google Utilities库的功能。 UI中的内容更加流畅。我已经尝试了各种不同的数组(列表,稀疏数组等)来处理我的数据,到目前为止,它确实运行良好。我相信使用拟议的sqlite会很快。
最初,当您添加所有标记时,您将需要找出最快/最好的方式来处理异步任务(因为我正在使用... btw Android Query是一个非常好的异步内容库),所以签出:
List<Marker> markers = new ArrayList<Marker>();
...虽然在后台运行,但是Android Map Extensions提供的标记聚类将为您完成其余工作。
[我也看到过其他技术,例如在异步任务中使用计时器,基本上一次添加100个标记,然后暂停您的异步任务,因此UI仍会有所响应。
希望其中一些帮助。
起初,我不会从互联网上即时刷新标记。尝试结合两种方式:
不过,这种方法也有一些缺点:
我仍然在解决此类问题,因为我的应用程序必须显示约8000个标记。到目前为止,我只发现一种完全不可用的群集方法,因为群集本身与刷新本身所花费的时间大约相同,因此每次更改缩放级别时,UI线程都会阻塞很多秒钟。
集群地图扩展很棒,但是如果不必做那么多工作,而只是想从URL加载自定义制造商徽标,下面的解决方案将为您服务。
private fun loadMarkerOnGoogleMap(barVenueList: List<VenueModel>) {
for (row in barVenueList) {
val frame = BitFact.decodeResource(mActivity.resources, R.drawable.pin)
getBitmap(mActivity, row.logoImage, object : BitmapUtils.OnDownloadCallBack {
override fun marker(bitmap: Bitmap) {
val finalLogo = mergeToPin(frame, bitmap)
if (row.getLatitude() != null && row.getLongitude() != null) {
val latLong = LatLng(row.getLatitude()!!, row.getLongitude()!!)
val markerOptions = MarkerOptions().position(latLong)
markerOptions.title(row.venueName)
markerOptions.icon(BitDescFact.fromBitmap(finalLogo))
markerOptions.snippet(row.venueName)
val addMarker = mMap!!.addMarker(markerOptions)
addMarker.tag = row //set tag to get data when required
}
}
})
}
}
/**
* @param mActivity Activity,
* @param imageURL : String image url
* @param mCallBack : OnDownloadCallback
*/
fun getBitmap(mActivity: Activity, imageURL: String, mCallBack: OnDownloadCallBack) {
Glide.with(mActivity)
.asBitmap()
.load(imageURL)
.into(object : CustomTarget<Bitmap>(50, 50) {
override fun onLoadCleared(placeholder: Drawable?) {
println("onLoadCleared ## ")
}
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
println("onResourceReady ## ")
mCallBack.marker(resource)
}
})
}
/**
* Interface to listen download
*/
interface OnDownloadCallBack {
fun marker(bitmap: Bitmap)
}