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);要清就清完,这就是斩草除根……
如果有什么写到有些偏颇的地方欢迎大家指出,谢谢。