好记性不如铅笔头

android, 编程

Android应用开发笔记:Handler弱引用

新版本的android sdk在使用handler的时候会有一个警告:

This Handler class should be static or leaks might occur 。

大致意思就是说:Handler类应该定义成静态类,否则可能导致内存泄露。

具体如何解决,在国外有人提出,如下:

Issue: Ensures that Handler
classes do not hold on to a reference to an outer class

In Android,
Handler classes should be static or leaks might occur. Messages enqueued on the
application thread’s MessageQueue also retain their target Handler. If the
Handler is an inner class, its outer class will be retained as well. To avoid
leaking the outer class, declare the Handler as a static nested class with a
WeakReference to its outer class. 

大体翻译如下:

Handler
类应该应该为static类型,否则有可能造成泄露。在程序消息队列中排队的消息保持了对目标Handler类的应用。如果Handler是个内部类,那
么它也会保持它所在的外部类的引用。为了避免泄露这个外部类,应该将Handler声明为static嵌套类,并且使用对外部类的弱应用。

查找相关资料后,得出的比较好的解决方式如下:

public class MainActivity extends Activity {
	private MainActHandler handler = new MainActHandler(this);

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	private static class MainActHandler extends Handler 
	{
		private WeakReference<MainActivity> activity = null;

		public MainActHandler(MainActivity act) {
			super();
			this.activity = new WeakReference<MainActivity>(act);
		}

		@Override
		public void handleMessage(Message msg) 
		{
			MainActivity act = activity.get();
			if (null == act) {
				return;
			}
			switch (msg.what) 
			{
			}
		}
	}
	
}

发表评论

13 + 20 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据