3

私のアプリケーションはエラーメッセージなしで閉じられ、アクティビティを約20回または30回切り替えた後に自動的に再起動します。別のデータで現在のアクティビティを再起動するボタンをタップしてこれをテストしています(データの終わりに達すると最初に戻ります)。アクティビティはFLAG_ACTIVITY_CLEAR_TOPフラグを付けて起動されるため、一度にメモリ内にアクティビティのインスタンスが1つだけ存在する必要があります。設定FLAG_ACTIVITY_NO_HISTORYしても問題は発生します。

これは、アプリがクラッシュしたときにlogcat出力に表示されます。

06-28 19:32:10.472: I/ActivityManager(115): Process com.mypackage.myapp (pid 3718) has died.
06-28 19:32:10.476: I/WindowManager(115): WIN DEATH: Window{406d06e0 com.mypackage.myapp/com.mypackage.myapp.welcome.LoginActivity paused=false}
06-28 19:32:10.480: E/InputDispatcher(115): channel '406ade20 com.mypackage.myapp/com.mypackage.myapp.matchup.MatchUpActivity (server)' ~ Consumer closed input channel or an error occurred.  events=0x8
06-28 19:32:10.480: E/InputDispatcher(115): channel '406ade20 com.mypackage.myapp/com.mypackage.myapp.matchup.MatchUpActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
06-28 19:32:10.535: I/WindowManager(115): WIN DEATH: Window{406ade20 com.mypackage.myapp/com.mypackage.myapp.matchup.MatchUpActivity paused=false}
06-28 19:32:10.539: I/WindowManager(115): WIN DEATH: Window{407a8230 com.mypackage.myapp/com.mypackage.myapp.fightcard.FightCardActivity paused=false}
06-28 19:32:10.566: I/ActivityManager(115): Start proc com.mypackage.myapp for activity com.mypackage.myapp/.fightcard.FightCardActivity: pid=3915 uid=10053 gids={3003}
06-28 19:32:10.574: I/ActivityManager(115): Low Memory: No more background processes.

通常、これはアプリがメモリリークしていることを示しますが、EclipseでDDMSパースペクティブを見ながらこのテストを実行すると、割り当てられたメモリが安定していることがわかります。実際、使用率が約50%座っています(ほとんどの場合、この場所に座っています)。ヒープサイズと割り当てられたメモリは増加していません。

私はこのアプリで広く使用MATしており、以前はメモリリークを発見しましたが、それらを解決し、そのツールで他の問題を見つけることができなくなりました。

ジンジャーブレッドを実行しているNexusSでこの問題を再現することはできましたが、4.0.4を実行しているGalaxy Nexusでは再現できないようです(ただし、Galaxyではヒープが大きいことが原因である可能性があります) )。

私は何が欠けていますか?

4

1 に答える 1

3

上記のDavidWasserの提案は、私を解決策に導きました。上記のコマンドを実行すると、カスタムフォントアセットの割り当てが大量に発生していることに気付きました。

zip:/data/app/com.mypackage.myapp-2.apk:/assets/DINNextLTPro-MediumCond.otf: 98K

これらの割り当ては、アクティビティを変更するにつれて非常に急速に増加しているように見えました。いくつかのグーグルは私をこのリンクに導きました:http ://code.google.com/p/android/issues/detail?id = 9904

したがって、カスタムフォントの使用に関連するAndroidのバグがあるようです。次の回避策は、上記のリンクから取得されました。

public class Typefaces {
    private static final String TAG = "Typefaces";

    private static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>();

    public static Typeface get(Context c, String assetPath) {
        synchronized (cache) {
            if (!cache.containsKey(assetPath)) {
                try {
                    Typeface t = Typeface.createFromAsset(c.getAssets(),
                            assetPath);
                    cache.put(assetPath, t);
                } catch (Exception e) {
                    Log.e(TAG, "Could not get typeface '" + assetPath
                            + "' because " + e.getMessage());
                    return null;
                }
            }
            return cache.get(assetPath);
        }
    }
}

基本的に、カスタムフォントアセットのインスタンスをキャッシュしているため、各インスタンスを1回だけインスタンス化する必要があります。

于 2012-07-04T19:12:41.157 に答える