通过弱引用及静态内部类减少内存泄漏问题

我们在开发app时,经常会使用静态内部类。在使用Handler类时,若不定义一个静态Handler子类,在使用是会提示This Handler class should be static or leaks might occur。就是说Handler类需要定义为静态类,否则可能会出现内存泄漏。

 

一般的解决办法如下:

1、定义一个静态内部类,继承自Handler

2、在静态内部类声明一个弱引用

 

下面通过一个下载图片功能的Activity例子来说明:

/**
 * 解决This Handler class should be static or leaks might occur 问题
 *
 */
public class HandlerLeakResolverActivity extends Activity {
	private static final String uri = "http://ww4.sinaimg.cn/bmiddle/786013a5jw1e7akotp4bcj20c80i3aao.jpg";
	private ImageView imageView;
	private Handler handler = new MyHandler(this);
	private ProgressDialog dialog;
	private static final Integer FINISHED = 1;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.image_load_layout);
		
		imageView = (ImageView) findViewById(R.id.imageView1);
		Button downloadImg = (Button) findViewById(R.id.btn_downloadImg);
		dialog = new ProgressDialog(this);
		dialog.setMessage("正在下载,请稍后...");
		dialog.setCancelable(false);
		
		downloadImg.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				imageView.setImageBitmap(null);
				// 启动新activity下载,可以显示图片
				new DownloadThread().start();
				dialog.show();
			}
		});
	}

	/**
	 * 自定义线程类,用于异步下载图片
	 * @author Chase
	 *
	 */
	private class DownloadThread extends Thread {
		@Override
		public void run() {
			Bitmap bitmap=null;
			HttpClient httpClient = new DefaultHttpClient();
			HttpGet httpGet = new HttpGet(uri);
			HttpResponse httpResponse = null;
			try {
				httpResponse = httpClient.execute(httpGet);
				if (httpResponse.getStatusLine().getStatusCode() == 200) {
					byte[] data = EntityUtils.toByteArray(httpResponse
							.getEntity());
					bitmap=BitmapFactory.decodeByteArray(data, 0, data.length);
					
					Message msg = Message.obtain();
					msg.obj = bitmap;
					msg.what = FINISHED;
					handler.sendMessage(msg);
				}
			} catch (Exception e) {
				Log.e(this.getClass().getName(),"图片下载出错!",e);
			}
		}
	}
	
	/**
	 * 定义一个Handler静态内部类
	 * @author Chase
	 *
	 */
	static class MyHandler extends Handler{
		// Activity的弱引用
		WeakReference<HandlerLeakResolverActivity> reference;
		public MyHandler(HandlerLeakResolverActivity activity) {
			reference = new WeakReference<HandlerLeakResolverActivity>(activity);
		}
		@Override
		public void handleMessage(Message msg) {
			HandlerLeakResolverActivity activity = reference.get();
			if(activity != null){
				if(msg.what == FINISHED){
					Bitmap bmp = (Bitmap)msg.obj;
					activity.imageView.setImageBitmap(bmp);
					activity.dialog.dismiss();
				}
			}
		}
	}
}

 

转载于:https://www.cnblogs.com/forchase/archive/2012/09/06/4080093.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值