Android 优化笔记,Handler

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);要清就清完,这就是斩草除根……

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值