android_java_handle的弱引用

在使用handle的时候提示使用static否则会内存泄漏,可以使用弱引用解决

当Activity finish后,延时消息会继续存在主线程消息队列中1分钟,然后处理消息。而该消息引用了Activity的Handler对象,然后这个Handler又引用了这个Activity。这些引用对象会保持到该消息被处理完,这样就导致该Activity对象无法被回收,从而导致了上面说的 Activity泄露。

WeakReference与SoftReference都可以用来保存对象的实例引用,这两个类与垃圾回收有关。
WeakReference是弱引用,其中保存的对象实例可以被GC回收掉。这个类通常用于在某处保存对象引用,而又不干扰该对象被GC回收,通常用于Debug、内存监视工具等程序中。因为这类程序一般要求即要观察到对象,又不能影响该对象正常的GC过程。
最近在JDK的Proxy类的实现代码中也发现了Weakrefrence的应用,Proxy会把动态生成的Class实例暂存于一个由Weakrefrence构成的Map中作为Cache。

SoftReference是强引用,它保存的对象实例,除非JVM即将OutOfMemory,否则不会被GC回收。这个特性使得它特别适合设计对象Cache。对于Cache,我们希望被缓存的对象最好始终常驻内存,但是如果JVM内存吃紧,为了不发生OutOfMemoryError导致系统崩溃,必要的时候也允许JVM回收Cache的内存,待后续合适的时机再把数据重新Load到Cache中。这样可以系统设计得更具弹性。

private static class MainHandler extends Handler {
	private final WeakReference<BaseScanActivity> weakReference;
	BaseScanActivity activity;

	public MainHandler(BaseScanActivity activity) {
		weakReference = new WeakReference<BaseScanActivity>(activity);
		activity = weakReference.get();
	}

	@Override
	public void handleMessage(Message msg) {
		switch (msg.what) {
		case HadwareControll.BARCODE_READ: {
			activity.onBarcodeRead(msg.obj + "\n");
			break;
		}
		}
	};
}

猜你喜欢

转载自zheyiw.iteye.com/blog/2082171