android——Handler的封装(添加软引用)、handle不造成内存泄漏的示例、new匿名实例是否会造成内存泄漏或崩溃

1、Handler的封装

封装handler:

/**
 * 软引用的Handler
 */
class MyHandler(mActivity: Activity, mListen: (Message?) -> Unit) : Handler() {
    private var mWeakReference: WeakReference<Activity> = WeakReference(mActivity)//添加弱引用
    private var mListen=mListen
    override fun handleMessage(msg: Message) {
        super.handleMessage(msg)
        if (mWeakReference.get() != null) {
            mListen(msg)
        }
    }
}

MainActivity:

class MainActivity : AppCompatActivity() {
    var myHandler = MyHandler(this) {
        Log.d("WY+", "it的数据为:$it")
        when (it!!.what) {
            1 -> {
                Log.d("WY+", "延时执行了")
            }
            2 -> {
                Log.d("WY+", "字符串数据为:" + it.obj)
            }
            3 -> {
                Log.d("WY+", "更新UI:" + it.obj)
                tv_1.text = it.obj.toString()//此处不用使用runOnUiThread

            }

        }
    }


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //第一种(延时)
        myHandler.sendEmptyMessageDelayed(1, 5000)

        //第二种(发送数据)
        var message: Message = myHandler.obtainMessage()
        message.what = 2
        message.obj = "字符串数据666"
        myHandler.sendMessage(message)

        //第3种(发送数据并且更新UI)
        var message1: Message = myHandler.obtainMessage()
        message1.what = 3
        message1.obj = "更新UI数据:000"
        myHandler.sendMessage(message1)

    }
}

避免oom的方法有两种:
1、弱引用(如上)
2、在ondestroy里面调用handler.removeCallbacksAndMessages(null);

demo的下载地址为:
https://download.csdn.net/download/wy313622821/12265063
结束!!!!

2、handle不造成内存泄漏的示例

		private Handler mHandler = new Handler(Looper.getMainLooper());
        private Runnable mRunnable = new Runnable() {
            @Override
            public void run() {
            // 运行的方法
                try {
                    
                } catch (Exception e) {                   
                    throw new RuntimeException(e);
                }
            }
        };

调用

mHandler.postDelayed(mRunnable, 5000);

释放(一般在ondestory里)

mHandler.removeCallbacks(mRunnable);

3、new匿名实例是否会造成内存泄漏或崩溃

  • 在Android中,创建多个匿名实例通常不会导致内存泄漏或崩溃,但这取决于实例的具体使用方式。
  • 如果您创建多个匿名实例并将它们存储在全局范围内,例如静态变量中,这可能会导致内存泄漏。这是因为每个实例都持有对它自己的引用,所以如果这些实例永远不会被清除,它们就会一直存在于内存中。
  • 另一方面,如果您只是在短时间内使用匿名实例,并且不会将它们存储在任何全局变量中,那么它们就不会导致内存泄漏或崩溃。
  • 总的来说,最好的做法是根据代码需求和性能需求来决定是否需要使用匿名实例,并确保在使用它们时正确地处理它们。

举个例子:

new Handler().postDelayed(new Runnable() { @Override public void run() { // 延时执行的代码 } }, 2000);

以上代码不会导致内存泄漏。因为在postDelayed()方法中传递的Runnable对象是匿名内部类,它不会持有外部类的引用。当延迟时间到达时,Runnable对象会被Handler处理并执行,然后被垃圾回收器回收。因此,不会发生内存泄漏。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wy313622821

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值