18

2 つの簡単なアクティビティを使用します。マップを保持する 2 番目のアクティビティを開始するためのボタンのみを保持する最初のアクティビティ:

主な活動:

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

public void goToMap(View view){ //This is just the onClick method for the button
    Intent intent=new Intent( this, BigMapTest.class);
    startActivity(intent);
}

マップ アクティビティ:

public class BigMapTest extends FragmentActivity {
SupportMapFragment mapFragment;
GoogleMap map;

@Override
protected void onCreate(Bundle arg0) {
    // TODO Auto-generated method stub
    super.onCreate(arg0);

    setContentView(R.layout.travel_diary_big_map);

    mapFragment=(SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.big_map);
    map=mapFragment.getMap();

}

マップ アクティビティの XML レイアウト:

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

<fragment
        android:id="@+id/big_map"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        class="com.google.android.gms.maps.SupportMapFragment"  
        />

このコードを実行すると、ボタンを押してマップのあるアクティビティに移動し、戻るボタンを押して最初のアクティビティに移動します...このプロセスを繰り返すと、ヒープが到達するまで毎回サイズが増加することがわかりますそれは限界であり、それからクランプを開始します。マップ (ズームなど) をもう少しいじると、この時点で OOM 例外が発生する可能性があります。

01-25 16:10:13.931: D/dalvikvm(21578): GC_FOR_ALLOC 解放 1898K、7% 解放 45859K/49187K、一時停止 204ms
01-25 16:10:14.671: I/dalvikvm-heap(21578): ターゲット GC をクランプ52.724MB から 48.000MB へのヒープ
01-25 16:10:14.671: D/dalvikvm(21578): GC_CONCURRENT 解放された 2534K、6% 解放された 46554K/49187K、一時停止 3ms+14ms
01-25 16:10:15.372: I/dalvikvm -heap(21578): ターゲット GC ヒープを 52.979MB から 48.000MB
01-25 16:10:15.382: D/dalvikvm(21578): GC_CONCURRENT 解放 2273K、5% 解放 46815K/49187K、一時停止 3ms+15ms
01-25 16:10:15.622: I/dalvikvm-heap(21578): ターゲット GC ヒープを 52.604MB から 48.000MB
01-25 16:10:15.622: D/dalvikvm(21578): GC_FOR_ALLOC 解放 657K、6% 解放 46431K/ 49187K、一時停止 202ms
01-25 16:10:16.203: I/dalvikvm-heap(21578): ターゲット GC ヒープを 52.959MB から 48.000MB に
クランプフリー 46796K/49187K、一時停止 217ミリ秒
01-25 16:10:16.203: I/dalvikvm-heap(21578): 278744 バイト割り当ての SoftReferences のコレクションを強制
01-25 16:10:16.423: I/dalvikvm-heap(21578 ): ターゲット GC ヒープを 52.952MB から 48.000MB にクランプする
01-25 16:10:16.423: D/dalvikvm(21578): GC_BEFORE_OOM は 9K を解放し、5% は 46786K/49187K を解放し、219ms
01-25 16:10:16.423: E/dalvikvm-heap(21578): 278744 バイトの割り当てでメモリが不足しています。

任意の提案/ヘルプをいただければ幸いです。

4

4 に答える 4

8

いくつかの基本的なMAT調査からわかるように、表示されているのは、ダウンロードされたマップデータのMapsV2によって維持されているキャッシュです。パンとズームをたくさん行うと、キャッシュが大きくなるようです。マップを離れて後で新しいマップに戻ると、キャッシュは縮小します。サンプルアプリのマップアクティビティをN回起動してもN個のキャッシュを取得できませんでした。また、ユーザーの操作に応じて、キャッシュサイズが増減しました。

残念ながら、このキャッシュは構成できません。AFAIKは、キャッシュの大きさ、クリアされたとき、ディスクに波及するなどの点で、AFAIKです。

したがって、デフォルトでは、Maps V2で使用できるヒープスペースの健全なチャンクを残して、この小さなヒープのサブセット内にとどまるための手順を実行するだけです。

実験したい場合は、、またはを呼び出しclear()て、このキャッシュサイズを減らすのに役立つかどうかを確認してください。GoogleMaponLowMemory()SupportMapFragment

于 2013-01-26T15:10:53.717 に答える
2

Android デベロッパー 17:10 - Google+ ページ

Google Play サービス v3.0 を展開しています。これには、Google+ サインインと Google Maps Android API の改善が導入されています。

2013 年 2 月 26 日の時点で、gmaps-api-issues ページにも記載されているこの問題は、現在のGoogle API Updateによって修正されています。

于 2013-02-26T21:58:44.303 に答える
1

私はまったく同じ問題を抱えています。V2 マップをホストするアクティビティが開始されるたびに、メモリが増加します。そして活動が終わっても解放されません。

したがって、回避策はそのアクティビティを再利用することです。アクティビティsingleTaskをマニフェストに作成し、代わりにfinish()使用しますmoveTaskToBack(true);

于 2013-01-30T09:13:10.223 に答える
-1

レイアウトでこれを使用します。

<LinearLayout
        android:id="@+id/map_container2"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:layout_weight="35.22"
        android:orientation="horizontal" >

        <fragment
            android:id="@+id/map1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            class="com.google.android.gms.maps.SupportMapFragment"
            map:cameraTargetLat="40.72"
            map:cameraTargetLng="-74.00"
            map:cameraZoom="8" />
    </LinearLayout>

そして、このコード:

onCreate{
   setUpMapIfNeeded();
}

private void setUpMapIfNeeded() {
        // TODO Auto-generated method stub
        // Do a null check to confirm that we have not already instantiated the map.
        if (mMap == null) {
            // Try to obtain the map from the SupportMapFragment.
            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map1))
                    .getMap();
            // Check if we were successful in obtaining the map.
            if (mMap != null) {
                setUpMap();
            }
        }
    }

private void setUpMap() {
        // TODO Auto-generated method stub
         // Hide the zoom controls as the button panel will cover it.
        mUiSettings = mMap.getUiSettings();
 // Enables/disables zoom gestures (i.e., double tap, pinch & stretch).
        mMap.getUiSettings().setZoomGesturesEnabled(false);
// Enables/disables scroll gestures (i.e. panning the map).
        mMap.getUiSettings().setScrollGesturesEnabled(false);
 // Enables/disables the compass (icon in the top left that indicates the orientation of the
        // map).
        mMap.getUiSettings().setCompassEnabled(false);
        // Add lots of markers to the map.
        addMarkersToMap();

        // Pan to see all markers in view.
        // Cannot zoom to bounds until the map has a size.
        final View mapView = getSupportFragmentManager().findFragmentById(R.id.map1).getView();
        if (mapView.getViewTreeObserver().isAlive()) {
            mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
                @SuppressLint("NewApi") // We check which build version we are using.
                @Override
                public void onGlobalLayout() {
                    LatLngBounds bounds = new LatLngBounds.Builder()
                            .include(WOODS)
                            .build();
                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
                      mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    } else {
                      mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    }
                    mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 50));
                }
            });
        }
    }

private void addMarkersToMap() {
        // TODO Auto-generated method stub
         // Uses a colored icon.
        mWoods = mMap.addMarker(new MarkerOptions()
                .position(WOODS)
                .title("Woods")
                .snippet("R. Quatá, 1016, Vila Olimpia - (11) 3849-6868")
                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
    }
于 2013-01-25T14:44:52.350 に答える