gpt4 book ai didi

onDelete 后的 android widget 仍然在听

转载 作者:搜寻专家 更新时间:2023-11-01 09:16:24 24 4
gpt4 key购买 nike

我有一个在 GameLogic 单例中调用一些更新方法的服务。 GameLogic 可能会决定需要进行一些状态更新。在这种情况下,它会通知其监听器有关 StatusUpdateEvent 的信息。听众然后更新他们的观点等。

public class GameLogic {
// ... attributes ...
private static GameLogic instance = null;
private GameLogic() {
// singleton pattern
}
public static synchronized GameLogic getInstance() {
if (instance == null) {
instance = new GameLogic();
}
return instance;
}
public void checkStatus() {
// called by service
// ... some checks
notifyStatusUpdate(new StatusUpdateEvent());
}
public void addStatusUpdateListener(StatusUpdateListener listener) {
if (!listeners.contains(listener)) {
listeners.add(listener);
}
}
public void removeStatusUpdateListener(StatusUpdateListener listener) {
listeners.remove(listener);
}
protected synchronized void notifyStatusUpdate(StatusUpdateEvent event) {
for (StatusUpdateListener l : listeners) {
l.onStatusUpdate(event);
}
}
}

我有一个应该监听 StatusUpdateEvent 的小部件:

public class ProjectWidget extends AppWidgetProvider implements StatusUpdateListener {
// ... attributes ...
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
this.context = context;
this.appWidgetManager = appWidgetManager;
this.remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_2x1);
this.thisWidget = new ComponentName(context, ProjectWidget.class);

GameLogic.getInstance().addStatusUpdateListener(this);
}

@Override
public void onDeleted(Context context, int[] appWidgetIds) {
Toast.makeText(context, "onDeleted", Toast.LENGTH_SHORT).show();
GameLogic.getInstance().removeStatusUpdateListener(this);
super.onDeleted(context, appWidgetIds);
}
@Override
public void onStatusUpdate(StatusUpdateEvent e) {
android.util.Log.d("ProjectWidget", "onStatusUpdate");
// here some class fields are updated like this.project = e.getProject();
// ...
updateViews();
appWidgetManager.updateAppWidget(thisWidget, remoteViews);
}
// ... updateViews() etc.
}

但是现在的问题是:我将小部件添加到主屏幕,一切正常。然后,如果我从主屏幕删除小部件,我会看到 onDelete Toast,但之后我仍然会看到该日志条目:ProjectWidget onStatusUpdate。

所以监听器没有被删除.. 为什么?我该怎么做?

谢谢!

最佳答案

So the listener is not removed.. why? and how can I do that stuff?

您遇到的是内存泄漏。

AppWidgetProvider 是一个临时对象。它会存在足够长的时间来处理 onUpdate() 或其他应用小部件生命周期方法,然后它就会消失。

Never never never never never never 尝试让 AppWidgetProvider 的生命周期比这更长,比如通过照原样在静态上下文中注册它。您正在泄漏内存,因为 AppWidgetProvider 不会被垃圾回收。

当您调用 removeStatusUpdateListener() 时,您有一个不同于 addStatusUpdateListener()AppWidgetProvider 实例。因此,删除操作是空操作(您正在删除从未注册的内容),并且原始监听器将永远保留在那里。

让您的 GameLogic 或任何直接更新您的应用小部件 RemoteViews

关于onDelete 后的 android widget 仍然在听,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4408184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com