Android 优化笔记,Handler

    xiaoxiao2026-10-03  9

    Android 也已经学习了一段时间了,一路走来,开始看着这东西好像不难,啥都不懂,只要一个方法一个方法的调就是了;又学了一段时间,不满足于啥都不懂,而是默默的去看为啥这个方法可以达到我要的目的?怎么实现的?这个实现的方法中有哪些是我需要学习的?根据这些我可以在那些地方做一些改变,优化?这样走下来,我是一脸的懵逼……

    在我懵逼的过程中感谢网络上的各位前辈的无私奉献,详尽的解析。也萌生了我开始做笔记,记录一下自己的经历和过程吧……

    首先上代码

    <span style="font-size:14px;"><strong> private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case 1: // break; } }; };</strong></span> 这是一个写handler的方式,也是我最初最喜欢的方式,简单粗暴明了。

    很直接的就把Handler 声明,并且需要他完成的目的都一部到位了。

    下面呢就开始一步步的优化进程了:

    首先:我们看,在

    <span style="font-size:14px;"><strong>public void handleMessage(android.os.Message msg)</strong></span> 中,是需要对UI线程进行操作的,那么肯定会调用Activity中的属性或者方法。而这些属性和方法并不属于Handler本身,而是来自于handler 的外部类。这里就需要提到:

    在java里,非静态内部类 和 匿名类 都会潜在的引用它们所属的外部类。但是,静态内部类却不会。

    所以第一个优化点来了:将Handler 改为静态:

    既然改为静态,那么这里的Handler 将无法直接调用外部类的非静态属性和方法。我们不可能为了让handler可以调用方法把activity中的属性和方法全部改为静态。如果这样我们何必谈优化呢?

    那么这时,我们就需要在handler中获取activity的对象:

    如果这时我们通过构造方法: handler(Activity act){this.act =act}; 这种方式获取activity的对象,那岂不是和最初一样了?

    所以这时就需要用到弱引用了:

    <pre name="code" class="java">private static class Mhandler extends Handler { <span style="white-space:pre"> </span>private final WeakReference<MainActivity> mact; public Mhandler(MainActivity act) { mact = new WeakReference<MainActivity>(act); } @Override public void handleMessage(Message msg) { MainActivity act = mact.get(); switch (msg.what) { case 0: //內容 break; } } };

    这里需要注意两点:

    1、全局static变量会在app启动时就放入内存的静态存储区(方法区),并且保持在整个项目的整体运行中都持续存在,所以最初的简单粗暴的写法不能仅仅只是加上static 就假装可以用了;

    2、软引用的对象会在JVM虚拟机内存不足的时候被回收。这样就需要在每次使用的时候做为空判定,不论在哪里。

    handler的创建已经完成了,使用过程中因人而异,那么结束呢?

    如果在handleMessage 方法中写入  handler.sendEmptyMessageDelayed(0, 5000);并log一下,就会看见,即使关闭了activity,这里的handler并没随着activity一起销毁,那么问题来了:怎么停止呢?系统提供了几个方法:

    public final void removeCallbacks(Runnable r); public final void removeCallbacks(Runnable r, Object token); public final void removeCallbacksAndMessages(Object token); public final void removeMessages(int what); public final void removeMessages(int what, Object object); 个人而言喜欢用: handler.removeCallbacksAndMessages(null);要清就清完,这就是斩草除根……

    如果有什么写到有些偏颇的地方欢迎大家指出,谢谢。

    转载请注明原文地址: https://ju.6miu.com/read-1312589.html
    最新回复(0)