Android 带有上下文的静态内存泄漏

Android 带有上下文的静态内存泄漏,android,memory,static,this,android-context,Android,Memory,Static,This,Android Context,我一直在做一些研究,但我仍然不能100%确定这是否会导致一场灾难 内存泄漏。我使用的是按钮视图(v.context)。我想我没问题,因为上下文不是静态存储的,但是如果可能的话,我希望得到一些反馈。我看到的主要问题是OSMonitor。。。(M)值不断上升。每次打开/关闭小部件和屏幕旋转时 32M 43M 61M 77M 等等 我不确定(m)是兆字节还是兆字节。如果这是基于堆栈,我假设Megebits perhpas,因为大多数高端设备的堆栈限制为32/48 MB(或其他) 感谢您的反馈/额外关注

我一直在做一些研究,但我仍然不能100%确定这是否会导致一场灾难 内存泄漏。我使用的是按钮视图(v.context)。我想我没问题,因为上下文不是静态存储的,但是如果可能的话,我希望得到一些反馈。我看到的主要问题是OSMonitor。。。(M)值不断上升。每次打开/关闭小部件和屏幕旋转时

32M 43M 61M 77M 等等

我不确定(m)是兆字节还是兆字节。如果这是基于堆栈,我假设Megebits perhpas,因为大多数高端设备的堆栈限制为32/48 MB(或其他)

感谢您的反馈/额外关注

这是市场上的旗帜应用,顺便说一句

public class Globals {

public static final String  PREF_NAME       = "BannerPreferences";
public static final int     MAX_TEXT_SIZE   = 20;

// refresh ALL widgets loaded on the user's screens
// this could be for removing or adding 'pendingIntents or during bootup
public static void refreshAllWidgets(Context context) {
    Logger.d("BANNER", "Globals:refreshAllWidgets");

    invalidateWidgets(context, BannerWidget.class); // 1x4
    invalidateWidgets(context, BannerWidget1x2.class);
    invalidateWidgets(context, BannerWidget2x2.class);
}

// there has to be a API way to do this!! Until then, just loop thru all
// widget_provider classes..
private static void invalidateWidgets(Context context, Class<?> cls) {

    ComponentName comp = new ComponentName(context, cls);
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

    int[] appWidgetIds = appWidgetManager.getAppWidgetIds(comp);

    for (int i = 0; i < appWidgetIds.length; i++) {
        BannerWidgetBase.updateAppWidget(context, appWidgetManager, appWidgetIds[i]);
    }

    appWidgetIds = null;
}
公共类全局变量{
公共静态最终字符串PREF_NAME=“bannerReferences”;
公共静态最终整数最大文本大小=20;
//刷新用户屏幕上加载的所有窗口小部件
//这可能是为了移除或添加“悬挂物”或在启动过程中
公共静态void refreshAllWidgets(上下文){
Logger.d(“BANNER”、“Globals:refreshAllWidgets”);
invalidateWidgets(上下文,BannerWidget.class);//1x4
invalidateWidgets(上下文,BannerWidget1x2.class);
invalidateWidgets(上下文,BannerWidget2x2.class);
}
//必须有一个API方法来实现这一点!!在此之前,只需循环遍历所有
//widget\u提供程序类。。
私有静态void invalidateWidgets(上下文上下文,类cls){
ComponentName comp=新的ComponentName(上下文,cls);
AppWidgetManager AppWidgetManager=AppWidgetManager.getInstance(上下文);
int[]appWidgetIds=appWidgetManager.getAppWidgetIds(comp);
for(int i=0;i
不必存在泄漏。由于Dalvik VM的性质,堆在使用时会不断增长,直到达到最大堆大小。但是,堆中可能有足够的空间容纳对象。我建议限制进程内存(堆)在仿真器映像中,查看是否确实出现OutOfMemoryError。创建仿真器时,有一个属性“Max VM application heap size”要设置,例如设置为32(以兆字节为单位)

如果您得到一个OutOfMemoryError,您应该仔细查看EclipseMat


S.S.:在你的情况下,你可能应该使用一个应用程序上下文,而不是一个活动。如果你从一个活动中触发它,考虑不要把活动作为一个上下文来传递。静态的东西可能会超过活动实例。

如果你认为你正在泄漏内存,使用DDMS来生成堆转储并分析结果。EclipseMat实用工具。@Commonware我按照指南使用它,但有点不知所措。我用Eclipse转换并打开了它,但我不能充分利用数据。真是太多了。