加快包含mapview的活动的启动并扩展MapviewActivity

时间:2010-11-12 09:46:23

标签: android

我有一个应用程序,其中包含一个MapviewActivity活动,主要是mapview。 但是我注意到活动的启动时间非常慢,从按下按钮进入地图活动的那一刻起就会出现延迟。我觉得这会造成糟糕的用户体验,并希望避免这种情况。 我已经根据googles开发者页面上的一篇关于UI改进的文章的建议,将地图活动的背景设置为@null,我觉得这样做并没有。

有没有办法改善这个?我不希望主要的主屏幕卡在活动的发布上,甚至转移到地图活动然后加载mapview会更好。

谢谢, 杰森

3 个答案:

答案 0 :(得分:8)

您可以尝试从布局中删除MapView。然后,在onCreate()中,使用post()安排Runnable添加MapView并从Java执行与地图相关的初始化。通过使用post()(或可能postDelayed())进一步推迟MapView,您应该能够首先呈现活动的其余部分。

我没试过这个,所以YMMV。 : - )

答案 1 :(得分:2)

这一直困扰着我一段时间,我通过扩展 CommonsWare&#39> 答案来解决这个问题:

我目前正在使用此解决方案,大大加快了我的活动加载时间,让所有内容看起来都很流畅。

我的MapActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map); // See activity_map.xml below.

    // Start a runnable that does the entire Map setup.
    // A delay does not seem to be necessary.
    Handler mapSetupHandler = new Handler();
    Runnable mapSetupRunnable = new Runnable() {
        public void run() {
            FragmentManager fragMan = getSupportFragmentManager();
            FragmentTransaction fragTransaction = fragMan.beginTransaction();

            final SupportMapFragment mapFragment = new SupportMapFragment();
            fragTransaction.add(R.id.container_map, mapFragment, "mapFragment");
            fragTransaction.commit();

            // At the end, retrieve the GoogleMap object and the View for further setup,
            // zoom in on a region, add markers etc.
            mapFragment.getMapAsync(new OnMapReadyCallback() {
                @Override
                public void onMapReady(GoogleMap googleMap) {
                    mMap = googleMap;
                    mMapView = mapFragment.getView();
                    setUpMap();
                }
            });
        }
    };
    mapSetupHandler.post(mapSetupRunnable);
}

布局/ activity_map.xml:

<RelativeLayout    
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<!--This FrameLayout will be used by the GoogleMap-->
<!--as a container for the SupportMapFragment.-->
<FrameLayout
    android:id="@+id/container_map"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:layout_above="@id/bar_room_password"
    android:layout_below="@id/toolbar">

    <!--Initially the container is filled with a placeholder image.-->
    <!--A small, heavily blurred image of a map screenshot is used-->
    <!--in order to fake a loading map.-->
    <ImageView
        android:id="@+id/image_map_placeholder"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:alpha="50"
        android:contentDescription="@string/map"
        android:scaleType="centerCrop"
        android:src="@drawable/placeholder_map" />
</FrameLayout>

[... more, unrelated Views...]
</RelativeLayout>

活动很快就会显示,因为设置是在Runnable中处理的。此外,我不是在GoogleMap进行设置和下载时显示空视图,而是显示地图的模糊虚假图像。

Google徽标相对较早地被放置在ImageView的顶部,因此只需128x128像素的图像就可以令人信服:

ImageView below GoogleMap in an Activity as a mock loading screen

答案 2 :(得分:1)

我尝试了CommonsWare的答案,但是在没有MapView的情况下甚至推出了一个没有MapView的裸MapActivity会有很大的延迟。

所以,我把另一个活动放在中间,“MapLoading”。我的家庭活动启动MapLoading,然后使用post()立即启动MapActivity。由于滞后,应用程序坚持使用MapLoading几秒钟(这是预期的结果,而不是坚持我的家庭活动)。

MapLoading活动设置了noHistory,因此当从MapActivity单击后退按钮时,它会直接进入主屏幕。 MapActivity的未来发布非常快,MapLoading活动只是在屏幕上闪烁。

以下是MapLoading的代码(其中包含MapView的活动称为Map):

public class MapLoading extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.maploading);

        new Handler().post(new Runnable() {
            public void run()
            {
                startActivity(new Intent(MapLoading.this, Map.class));
            }
        });
    }
}

这是它的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/maploading"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center"
        android:textSize="14pt"
        android:text="Loading map..."
        />

</RelativeLayout>

AndroidManifest.xml中的相应节:

<activity android:label="@string/app_name"
          android:name="MapLoading"
          android:noHistory="true" />