iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >android内存泄露:4、Toast的错误使用导致内存泄露
  • 216
分享到

android内存泄露:4、Toast的错误使用导致内存泄露

toastAndroid 2022-06-06 13:06:05 216人浏览 八月长安
摘要

目录 一、前言 二、Toast的错误使用导致内存泄露 1、新建一个 Module,写主界面 MainActivity,布局 activity_main 2、写业务逻辑 3、效果

目录

一、前言

二、Toast的错误使用导致内存泄露

1、新建一个 Module,写主界面 MainActivity,布局 activity_main

2、写业务逻辑

3、效果展示

4、解决方案

一、前言

上篇文章我们介绍了:Handler的错误使用导致内存泄露详细可参考博文:原创 Android内存泄露:3、Handler的错误使用导致内存泄露 ,这篇文章我们将介绍:Toast的错误使用导致内存泄露

二、Toast的错误使用导致内存泄露

我们通常,连续点击按钮多次提示的 Toast,它必须等待前面的 Toast显示完了,后面的才能显示出来。

这可能在某种情境下,不是我们想要的。

假如我们想要的结果是:当我点击多次按钮,必须把我最新的 Toast显示出来。

这个时候我们需要去写一个单例的 Toast,但是我们在写的时候,可能会导致我们 Activity的泄露。

1、新建一个 Module,写主界面 MainActivity,布局 activity_main

MainActivity


public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void showToast(View view) {
        startActivity(new Intent(MainActivity.this, ToastActivity.class));
    }
}

activity_main



    
2、写业务逻辑

创建一个 Toast的工具


public class ToastUtils {
    private static Toast sToast;
    public static void showToast(Context context, String msg) {
        if (sToast == null) {
            sToast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);
        }
        sToast.setText(msg);
        sToast.show();
    }
}

ToastActivity


public class ToastActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_toast);
        ToastUtils.showToast(this, new Date().getTime()+"");
    }
}
3、效果展示

类似上几篇文章,使用 LeakCanary工具,会测试到内存泄露的相关信息,这里就不截图和录视频了。

4、解决方案

解决方式:修改静态单例中对上下文的引用


public class ToastUtils {
    private static Toast sToast;
    public static void showToast(Context context, String msg) {
        if (sToast == null) {
            //sToast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);
            //我们让静态的Toast引用到全App唯一的一个Application的上下文对象即可
            sToast = Toast.makeText(context.getApplicationContext(), msg, Toast.LENGTH_SHORT);
        }
        sToast.setText(msg);
        sToast.show();
    }
}

有关 Android上下文 比较好的文章:

https://blog.csdn.net/YuDBL/article/details/105575178

sToast 什么时候会被 GC 给回收掉?

sToast 它是一个静态变量,静态的变量属于字节码级别的,字节码一旦被加载了,一般就不会移除了。

加载字节码是类加载器的工作,那么它是不会被 GC 给回收掉的,除非程序退出。

在java里面,类加载器分了好几种,你可以去自定义一个类加载器,它继承于ClassLoader,

当我们自定义的类加载器被卸载掉后,所加载的静态类对象才会被移除掉。

默认情况下,我们都使用系统自带的类加载器,它加载的静态对象,是不会被GC回收掉的。

所以静态变量不是越多越好,它不能够被回收。

注意:

1、之所以不在调用时候改,是因为工具类解决更好,因为在使用过程中可能会忘记这一点

2、虽然不用 static可以避免这个问题,但调用 ToastUtils的时候有点麻烦了


作者:luminal_Andy


--结束END--

本文标题: android内存泄露:4、Toast的错误使用导致内存泄露

本文链接: https://www.lsjlt.com/news/29573.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • android内存泄露:4、Toast的错误使用导致内存泄露
    目录 一、前言 二、Toast的错误使用导致内存泄露 1、新建一个 Module,写主界面 MainActivity,布局 activity_main 2、写业务逻辑 3、效果...
    99+
    2022-06-06
    toast Android
  • 内存泄露导致Android 中setVisibility() 失效原理
    目录一、前情概要二、摸索过程1、代码执行了吗?2、视图不显示的直接原因是什么?3、操作的视图是同一个吗?三、解决方案一、前情概要 目前,我在开发的一个 Android 项目需要各个功...
    99+
    2022-11-13
  • android内存泄露的问题
    Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端会出现内存无限制的增长,后系统瘫痪,那么如何快好的检测程序的稳定性,防止系统崩盘,...
    99+
    2022-06-06
    Android
  • 为什么Handle可能导致内存泄露
    一、未正确释放资源 当使用Handle时,必须确保在不再需要资源时正确释放它。如果没有正确释放Handle,资源将一直被占用,导致内存泄漏。例如,如果在打开文件后忘记关闭文件句柄,这将导致文件资源无法释放。 二、引用计数错误 某些编程语言使...
    99+
    2023-10-29
    内存 Handle
  • android内存泄露:1、LeakCanarys内存泄漏检测库、非静态的内部类错误使用
    一、前言 今天来复习一下有关内存泄露的知识,一个是把之前笔记整理一下,如有一些工具版本更新会写一些当下的使用介绍。另外会参考网上比较好的博文进行修正改进一些知识点 二、内存泄露...
    99+
    2022-06-06
    内部类 静态 Android
  • 内存泄露导致Android中setVisibility()失效怎么解决
    本篇内容介绍了“内存泄露导致Android中setVisibility()失效怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、前情...
    99+
    2023-07-02
  • android的GC内存泄露问题
    1. android内存泄露概念 不少人认为JAVA程序,因为有垃圾回收机制,应该没有内存泄露。其实如果我们一个程序中,已经不再使用某个对象,但是因为仍然有引用指向它,垃圾回收...
    99+
    2022-06-06
    Android
  • 使用Android Studio检测内存泄露(LeakCanary)
    内存泄露,是Android开发者最头疼的事。可能一处小小的内存泄露,都可能是毁千里之堤的蚁穴。 怎么才能检测内存泄露呢? AndroidStudio 中Memory控件台(显...
    99+
    2022-06-06
    Android Studio studio leakcanary Android
  • Android 中Handler引起的内存泄露
    在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用。通常我们的代码会这样实现。 public class SampleActivity ext...
    99+
    2022-06-06
    handler Android
  • c++循环引用导致的内存泄露如何解决
    在 C++ 中,循环引用(circular reference)是指两个或多个对象相互引用,导致内存泄漏的情况。解决循环引用导致的内...
    99+
    2023-10-10
    c++
  • Java 使用 VisualVM 排查内存泄露
    文章目录 1. 问题发生2. 排查过程2.1 初步排查2.2 Visual VM 内存分析2.3 代码分析 1. 问题发生 线上突发告警,笔者负责的一个服务老年代内存使用率到达 75% 阈值,于是立即登录监控系统查看数...
    99+
    2023-08-20
    java jvm linux
  • Go 中 time.After 可能导致的内存泄露问题解析
    目录一、Time 包中定时器函数定时函数:NewTicker,NewTimer 和 time.After 介绍二、time.After 导致的内存泄露基本用法有问题代码用pprof分...
    99+
    2023-05-18
    go time.After 内存泄露 time.After 内存泄露 go time.After 
  • 避免 Android中Context引起的内存泄露
    Context是我们在编写Android程序经常使用到的对象,意思为上下文对象。 常用的有Activity的Context还是有Application的Context。Acti...
    99+
    2022-06-06
    context Android
  • Android中怎么利用Handler防止内存泄露
    今天就跟大家聊聊有关Android中怎么利用Handler防止内存泄露,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 Handler可能导致的内存泄露及其优化 &...
    99+
    2023-05-30
    android handler
  • android内存泄露的根本原因是什么
    Android内存泄漏的根本原因是因为对象在不再使用时未能被垃圾回收器正确地回收,导致内存持续占用和增加。这主要是因为以下几个常见情...
    99+
    2023-09-15
    android
  • Android 消息机制以及handler的内存泄露
    Handler 每个初学Android开发的都绕不开Handler这个“坎”,为什么说是个坎呢,首先这是Android架构的精髓之一,其次大部分人都是知其然却不知其所以然。今...
    99+
    2022-06-06
    消息机制 handler Android
  • 基于ThreadLocal 的用法及内存泄露(内存溢出)
    目录使用构造方法静态方法公共方法内存泄露解决方法为什么要将ThreadLocal 定义成 static 变量对ThreadLocal内存泄漏引起的思考概述使用场景样例代码Thread...
    99+
    2022-11-12
  • Android中使用Handler造成的内存泄露如何解决
    这篇文章将为大家详细讲解有关Android中使用Handler造成的内存泄露如何解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、什么是内存泄露?  Java使用有向图机制,通过GC自动...
    99+
    2023-05-30
    android handler
  • 怎么用JS理解IE的内存泄露
    这篇文章主要讲解了“怎么用JS理解IE的内存泄露”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用JS理解IE的内存泄露”吧!一、前言IE6~8除了不遵守...
    99+
    2022-10-19
  • 浅谈JVM之使用JFR解决内存泄露
    目录简介一个内存泄露的例子使用JFR和JMC来分析内存泄露OldObjectSample简介 虽然java有自动化的GC,但是还会有内存泄露的情况。当然java中的内存泄露跟C++中...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作