如何在Android应用当中避免内存溢出问题

 我来答
千锋教育
2015-12-10 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
展开全部

主要要遵循以下几点:

  1. 不要为Context长期保存引用(要引用Context就要使得引用对象和它本身的生命周期保持一致)。

  2. 如果要使用到Context,尽量使用ApplicationContext去代替Context,因为ApplicationContext的生命周期较长,引用情况下不会造成内存泄露问题

  3. 在你不控制对象的生命周期的情况下避免在你的Activity中使用static变量。尽量使用WeakReference去代替一个static。

  4. 垃圾回收器并不保证能准确回收内存,这样在使用自己需要的内容时,主要生命周期和及时释放掉不需要的对象。尽量在Activity的生命周期结束时,在onDestroy中把我们做引用的其他对象做释放,比如:cursor.close()。

huanglenzhi
2015-05-31 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517188
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
一、内存溢出
现在的智能手机内存已经足够大,但是对于一个应用程序来说智能手机当中稀缺的内存,仍然是应用程序的一大限制。在Android应用程序开发当中,最常见的内存溢出问题(OOM)是在加载图片时出现的,尤其是在不知道图片大小的情况下。
潜在的内存溢出操作主要包括以下几点:
1、从网络当中加载用户特定的图片。因为直到我们在下载图片的时候我们才知道图片的大小。
2、向Gallery加载图片。因为现在智能手机的摄像头有很高的分辨率,在加载图片的时候需要最图片进行处理,然后才能正常的使用。
请注意一点,Android系统是从系统全局的观念来分配内存以加载图片的,这就意味着,即使你的应用有足够大的内存可用,内存溢出问题(out of memroy,OOM)仍然可能出现,因为所有的应用共享一个加载图片的内存池(我们使用BitmapFactory进行解析)。
二、解决内存溢出问题
原文(Downsampling为了好理解,解释为,程序A)。程序A通过调整像素,同时使其均衡化来降低图片的分辨率。因为不管问题图片是因为太大而不能再手机上正常显现,这个图片都会缩短其宽度以在ImageView当中显示,当图片在ImageView当中显示时,我们会因为加载一些没有必要的原始图片而浪费掉内存。
因此,更加有效的加载图片的时机是在其初始化处理的时候。
以下是处理代码:
1: private static Bitmap getResizedImage(String path, byte[] data, int targetWidth){
2:
3: BitmapFactory.Options options = new BitmapFactory.Options();
4: options.inJustDecodeBounds = true;
5:
6: BitmapFactory.decodeFile(path, options);
7:
8: int width = options.outWidth;
9:
10: int ssize = sampleSize(width, targetWidth);
11:
12:
13: options = new BitmapFactory.Options();
14: options.inSampleSize = ssize;
15:
16: Bitmap bm = null;
17: try{
18: bm = decode(path, data, options);
19: }catch(OutOfMemoryError e){
20: AQUtility.report(e);
21: }
22:
23:
24: return bm;
25:
26: }
27:
28: private static int sampleSize(int width, int target){
29:
30: int result = 1;
31:
32: for(int i = 0; i < 10; i++){
33:
34: if(width < target * 2){
35: break;
36: }
37:
38: width = width / 2;
39: result = result * 2;
40:
41: }
42:
43: return result;
44: }
三、AQuery
当在Android应用程序开发当中使用AQuery组件时,处理这个问题会变的更加的简单。
Down sample from the Internet
1: String url = "http://farm6.static.flickr.com/5035/5802797131_a729dac808_b.jpg";
2: aq.id(R.id.image1).image(imageUrl, true, true, 200, 0);

Down sample image from File
1: File file = new File(path);
2: //load image from file, down sample to target width of 300 pixels
3: aq.id(R.id.avatar).image(file, 300);
作者:liuxian13183
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式