1

osmdroid mapactivity を使用するアプリがあります。

画面の向きが変わるたびにヒープサイズが大きくなり、向きを数回変更した後、次のエラーが発生します。

12-12 00:53:08.990: E/dalvikvm-heap(6712): Out of memory on a 262160-byte allocation.
12-12 00:53:08.990: I/dalvikvm(6712): "filesystem" prio=5 tid=46 RUNNABLE
12-12 00:53:08.990: I/dalvikvm(6712):   | group="main" sCount=0 dsCount=0 obj=0x43057e08 self=0x571583c8
12-12 00:53:08.990: I/dalvikvm(6712):   | sysTid=8674 nice=0 sched=0/0 cgrp=apps handle=1487255264
12-12 00:53:08.990: I/dalvikvm(6712):   | schedstat=( 298265664 165380214 301 ) utm=25 stm=4 core=0
12-12 00:53:08.990: I/dalvikvm(6712):   at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
12-12 00:53:08.995: I/dalvikvm(6712):   at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:650)
12-12 00:53:08.995: I/dalvikvm(6712):   at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:389)
12-12 00:53:08.995: I/dalvikvm(6712):   at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:449)
12-12 00:53:08.995: I/dalvikvm(6712):   at org.osmdroid.tileprovider.tilesource.BitmapTileSourceBase.getDrawable(BitmapTileSourceBase.java:93)
12-12 00:53:08.995: I/dalvikvm(6712):   at org.osmdroid.tileprovider.modules.MapTileFilesystemProvider$TileLoader.loadTile(MapTileFilesystemProvider.java:142)
12-12 00:53:08.995: I/dalvikvm(6712):   at org.osmdroid.tileprovider.modules.MapTileModuleProviderBase$TileLoader.run(MapTileModuleProviderBase.java:241)
12-12 00:53:08.995: I/dalvikvm(6712):   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
12-12 00:53:08.995: I/dalvikvm(6712):   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
12-12 00:53:08.995: I/dalvikvm(6712):   at java.lang.Thread.run(Thread.java:856)
12-12 00:53:09.020: I/dalvikvm-heap(6712): Clamp target GC heap from 64.436MB to 64.000MB
12-12 00:53:09.050: I/dalvikvm-heap(6712): Forcing collection of SoftReferences for 262160-byte allocation
12-12 00:53:09.095: I/dalvikvm-heap(6712): Clamp target GC heap from 64.436MB to 64.000MB

2 つのフラグメントを保持するアクティビティがあり、これらのフラグメントの両方が、MapActivity を初期化する 1 つの抽象フラグメントを拡張します。

同じ問題を抱えている他の人々からのかなりの数の投稿を読みました。最終的に、抽象フラグメントに次の実装を行いました。

    @Override
    public void onDestroyView() {
        super.onDestroyView();

        unbindDrawables(con.findViewById(R.id.main_layout));
        System.gc();
    }

    private void unbindDrawables(View view) {
        if (view.getBackground() != null) {
            view.getBackground().setCallback(null);
        }
        if (view instanceof ViewGroup) {
            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
                unbindDrawables(((ViewGroup) view).getChildAt(i));
            }
            ((ViewGroup) view).removeAllViews();
        }
    }

conを初期化するonCreateViewは次のとおりです。

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        con = container;
        return inflater.inflate(R.layout.main_fragment,container, false);
    }

他に何ができるかわかりません。

誰でもこれを解決するのを手伝ってもらえますか?

ありがとう

4

2 に答える 2

2

画面の回転を自分で処理してみて、次のコードをアクティビティに追加してください

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
}

マニフェスト ファイルのアクティビティ タグに以下を追加します。

android:configChanges="orientation|keyboardHidden|screenSize"

于 2012-12-12T02:00:30.503 に答える
1

向きの変更は常に OS に任せてください。

方向の変更など、構成の変更があると、アクティビティが再作成されます。ほとんどのメモリ リークの原因は、ビューへの (暗黙的/明示的な) 参照を保持する非同期操作があるためです。これにより、ビューのガベージ コレクションが妨げられます。たとえば、CountDownTimer または非静的な内部ランナブルを使用する場合。

于 2016-05-27T06:20:21.520 に答える