java - 静态上下文保存在 Application 类中并在单例 Toast 构建器中使用,这是否会造成内存泄漏?

标签 java android memory-leaks singleton android-context

我有一个单例 Toast 显示类,它跟踪当前的 toast 并在再次启动时取消它:

public enum SingleToast {
    INSTANCE;

    private Toast currentToast;
    private String currentMessage;

    public void show(String message, int duration) {
        if (message.equals(currentMessage)) {
            currentToast.cancel();
        }

        currentToast = Toast.makeText(App.getContext(), message, duration);
        currentToast.show();

        currentMessage = message;
    }
}

(此示例的扩展说明可在此处找到:toast issue in android)

链接中的答案与这段代码之间的主要区别在于上下文,它不作为参数传递。我使用 App 类中保存的静态上下文来获取它,该上下文在应用程序启动时保存:

public class App extends Application {
    private static Context context;

    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
    }

    public static Context getContext() {
        return context;
    }
}

我在几个博客中读到过这个简单的上下文解决方案,它对于检索类中的上下文有很大帮助,对于这些类来说,将上下文作为参数传递是很烦人的,甚至是不可能的。

但是,我想知道我是否造成了内存泄漏!

首先:静态上下文本身是否会导致内存泄漏(如果是,我怎样才能防止它而不必总是到处传递上下文?)

其次:即使上下文本身不是静态的,在 toast 对象中使用上下文并将其保存为单例中的字段是否有问题?

最佳答案

第一 不会,如果只在Application中保存上下文,如上所述,不会导致内存泄漏。

关于第二种情况,与第一种情况几乎相同,但第一种实现起来比第二种更简单。

关于java - 静态上下文保存在 Application 类中并在单例 Toast 构建器中使用,这是否会造成内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40573279/

相关文章:

java - 您会推荐在 Java 中使用哪个 SVG 工具包?

java - 如何在 MapDB 中使用字节数组作为键

android - 带异步任务和自定义适配器的 ListFragment

android - 使用 Asp.Net 的 GCM 推送通知

iOS-如何修复来自 XCode 中模态转场的保留周期?

java - 如何实现通用接口(interface)列表

java - IBM MobileFirst 8 Java 适配器不接受正文中包含数组的 json

java - android recyclerview 不显示项目

ios - 如何使用 Xcode 中的仪器检查堆内存?

c# - WPF TreeView 泄漏所选项目