gpt4 book ai didi

java - Android 上的谷歌地图是非常慢还是我使用它的方式不对?

转载 作者:太空狗 更新时间:2023-10-29 12:56:56 25 4
gpt4 key购买 nike

因此,我将几个月前为 iOS 开发的应用移植回 Android。这个应用程序有一个包含几百 (341) 个点的数据库,可以在 map 上显示。在 iOS 上执行此操作时,我在将这些点添加到我的 map 时没有遇到性能问题。舒尔,如果用户缩小以便所有点同时可见,您会注意到一些减速但没什么大不了的。另一方面,在 Android 上,这速度慢得快要死。它在 AVD 上也比在手机(HTC Hero)上慢。

我想指出,我是 Java 的新手,但我有 C/C++/OBJ-C 方面的经验。我对我的代码进行了一些修改,并使用了一些简单的性能测量,并对我的代码得出了一些令人惊讶的结论。

这是我在 MapActivity 中用于向我的 map 添加叠加层的函数,我在其中留下了一些注释掉的代码,我将在其中进行解释。

private void addOverlaysToMapFromManagedInterestPoints() {

this.mapOverlays = myMap.getOverlays();

GeoPoint point;
OverlayItem overlayitem;



for( managed_interest_point mip : managedObjectManager.interestPoints )
{


TypeOfPoint type = getEnumForTypeOfPoint(mip.ZTYPEOFPOINT);
if(type!=null)
{
switch (type) {
case kAnimalHospital:
point = new GeoPoint(degreesToMicrodegreesConversion(mip.ZLATITUDE),degreesToMicrodegreesConversion(mip.ZLONGITUDE));
overlayitem = new OverlayItem(point, mip.ZTITLE, mip.ZSUBTITLE);
//this.animalHospitalOverlay.addOverlay(overlayitem);
AnnotationsOverlay testOverlay = new AnnotationsOverlay(this.animalHospitalPin,this);
testOverlay.addOverlay(overlayitem);
Log.d("MainActivity","added animalHospital");
break;
case kStore:
point = new GeoPoint(degreesToMicrodegreesConversion(mip.ZLATITUDE),degreesToMicrodegreesConversion(mip.ZLONGITUDE));
overlayitem = new OverlayItem(point, mip.ZTITLE, mip.ZSUBTITLE);
//this.storesOverlay.addOverlay(overlayitem);
AnnotationsOverlay testOverlay2 = new AnnotationsOverlay(storePin,this);
testOverlay2.addOverlay(overlayitem);
this.mapOverlays.add(testOverlay2);
Log.d("MainActivity","added Store point");
break;
case kVeterinary:
point = new GeoPoint(degreesToMicrodegreesConversion(mip.ZLATITUDE),degreesToMicrodegreesConversion(mip.ZLONGITUDE));
overlayitem = new OverlayItem(point, mip.ZTITLE, mip.ZSUBTITLE);
//this.storesOverlay.addOverlay(overlayitem);
AnnotationsOverlay testOverlay3 = new AnnotationsOverlay(this.veterinaryPin,this);
testOverlay3.addOverlay(overlayitem);
this.mapOverlays.add(testOverlay3);
Log.d("MainActivity","added veterinary point");
break;
default:
Log.d("MainActivity", "unknown enum");
break;
}//end switch
}//end if
}//end foreach

//this.mapOverlays.add(this.storesOverlay);
//this.mapOverlays.add(this.veterinariesOverlay);
//this.mapOverlays.add(this.animalHospitalOverlay);
Log.d("MainActivity","end of foreach in add overlays to map ");


}

这是 AnnotationsOverlay 的代码,我是 ItemizedOverlay 的子类。

public class AnnotationsOverlay extends ItemizedOverlay {

private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
Context mContext;



public AnnotationsOverlay(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));

}

public AnnotationsOverlay(Drawable defaultMarker,Context context)
{
super(boundCenterBottom(defaultMarker));
mContext=context;

}

@Override
protected OverlayItem createItem(int i) {


return mOverlays.get(i);
}

@Override
public int size() {

return mOverlays.size();
}

//show calloutAssesory view tapped för oss iPhöne människor
@Override
protected boolean onTap(int index) {
OverlayItem item = mOverlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.show();
return true;
}

public void addOverlay(OverlayItem overlay)
{
mOverlays.add(overlay);
populate();
}

我的第一直觉是在循环内分配 AnnotationsOverlay 是一件坏事,因为它似乎作为某种集合工作,您应该向其中添加多个项目。

这个假设被证明是错误的,因为对 add() 的每次后续调用都花费了越来越长的时间。我将这个分配放在循环中,现在这个函数在可接受的时间内执行。所有点都显示在 map 上,但它非常慢(可能更少 2 fps)。我认为每次调用 add 也调用 populate(); 很奇怪。功能。我已经尝试删除它并编写一个包装 populate 的公共(public)方法,我只在添加所有项目后才调用它,但这感觉并不正确。编写公共(public)方法来包装私有(private)方法通常不是一个好主意。它还给了我奇怪的行为,如果我这样做,所有的叠加层都会得到相同的图像。

那么我做错了什么,或者只是事实是 Android 上的 Google Maps API 比 iOS 上的灵活得多?

最佳答案

我在这里取得了一些进展,这可能对你们中的一些人阅读这个问题有用。1. 我现在已将我的填充方法从我的添加方法中移出并将其包装在公共(public)方法中,以便在填充整个 OverlayItems 数组后我只能调用一次。我还尝试在没有调试器的情况下运行该应用程序,即仅在手机上运行该应用程序,然后它就可以顺利运行了。这不是我唯一一次注意到调试器将速度降低了 10-20 倍或更多。过去我遇到过类似的问题,在 Debug模式下运行会在极长的时间内减慢某些操作。

新代码如下所示:

    private void addOverlaysToMapFromManagedInterestPoints() {

this.mapOverlays = myMap.getOverlays();

GeoPoint point;
OverlayItem overlayitem;



for( managed_interest_point mip : managedObjectManager.interestPoints )
{

if(mip==null)
{
Log.d("MainActivity","this should not happen!");
}

TypeOfPoint type = getEnumForTypeOfPoint(mip.ZTYPEOFPOINT);
if(type!=null)
{
switch (type) {
case kAnimalHospital:
point = new GeoPoint(degreesToMicrodegreesConversion(mip.ZLATITUDE),degreesToMicrodegreesConversion(mip.ZLONGITUDE));
overlayitem = new OverlayItem(point, mip.ZTITLE, mip.ZSUBTITLE);
this.animalHospitalOverlay.addOverlay(overlayitem);
Log.d("MainActivity","added animalHospital");
break;
case kStore:
point = new GeoPoint(degreesToMicrodegreesConversion(mip.ZLATITUDE),degreesToMicrodegreesConversion(mip.ZLONGITUDE));
overlayitem = new OverlayItem(point, mip.ZTITLE, mip.ZSUBTITLE);
this.storesOverlay.addOverlay(overlayitem);
Log.d("MainActivity","added Store point");
break;
case kVeterinary:
point = new GeoPoint(degreesToMicrodegreesConversion(mip.ZLATITUDE),degreesToMicrodegreesConversion(mip.ZLONGITUDE));
overlayitem = new OverlayItem(point, mip.ZTITLE, mip.ZSUBTITLE);
this.veterinariesOverlay.addOverlay(overlayitem);
Log.d("MainActivity","added veterinary point");
break;
default:
Log.d("MainActivity", "unknown enum");
break;
}//end switch
}//end if
}//end foreach

this.storesOverlay.callToPopulate();
this.veterinariesOverlay.callToPopulate();
this.animalHospitalOverlay.callToPopulate();


this.mapOverlays.add(this.storesOverlay);
this.mapOverlays.add(this.veterinariesOverlay);
this.mapOverlays.add(this.animalHospitalOverlay);
Log.d("MainActivity","end of foreach in add overlays to map ");


}



public class AnnotationsOverlay extends ItemizedOverlay {

private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
Context mContext;



public AnnotationsOverlay(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));

}

public AnnotationsOverlay(Drawable defaultMarker,Context context)
{
super(boundCenterBottom(defaultMarker));
mContext=context;

}

@Override
protected OverlayItem createItem(int i) {


return mOverlays.get(i);
}

@Override
public int size() {

return mOverlays.size();
}

//show calloutAssesory view tapped för oss iPhöne människor
@Override
protected boolean onTap(int index) {
OverlayItem item = mOverlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.show();
return true;
}

public void addOverlay(OverlayItem overlay)
{
mOverlays.add(overlay);
//populate();
}

public void callToPopulate()
{
populate();
}



}

关于java - Android 上的谷歌地图是非常慢还是我使用它的方式不对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5510800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com