我有一个应用程序,其中包含一个MapviewActivity活动,主要是mapview。
但是我注意到活动的启动时间非常慢,从按下按钮进入地图活动的那一刻起就会出现延迟。我觉得这会造成糟糕的用户体验,并希望避免这种情况。
我已经根据googles开发者页面上的一篇关于UI改进的文章的建议,将地图活动的背景设置为@null
,我觉得这样做并没有。
有没有办法改善这个?我不希望主要的主屏幕卡在活动的发布上,甚至转移到地图活动然后加载mapview会更好。
谢谢, 杰森
答案 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像素的图像就可以令人信服:
答案 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" />