android application被限制到16M堆内存。 越多的application保存在内存中,那么在他们之间切换的时候,速度就会更快。 a? 在一个规则的application中,你通常用俩中 当屏幕方向转变时,默认摧毁当前的activity 创建一个新的,android将重新加载application的ui。 如果你有一个大的bitmap你不想每次转变屏幕时都加载,如果你用一个static去总是保持它 private?static?Drawable?sBackground?; @Override protected?void?onCreate?(?Bundle?state?) {???super?.?onCreate?(?state?);?? TextView?label?=?new?TextView?(?this?);?? label?.?setText?(?"Leaks are bad"?);?? if?(?sBackground?==?null?)?{?? ? sBackground?=?getDrawable?(?R?.?drawable?.?large_bitmap?); ??}?? label?.?setBackgroundDrawable?(?sBackground?);?? setContentView?(?label?);?} 代码很快,但是也很错。他泄露了这第一个activity,当一个drawable被?attached to a view,这个VIEW被设置作为一个callback在这个drawable,在上述代码中,这意味着这个drawable有一个引用在 textview,而这个textview本身有一个引用在这个activity上,而这个activity依次有许多他自身的引用。你可以参看home screen源代码通过设置drawble的callback为空当activity被摧毁时。 /** * Remove the callback for the cached drawables or we leak the previous* Home screen on orientation change. */ FAQ: 1.If Drawable just a member field and not static - it’s fine right? An instance variable will not cause any problem indeed. 2.public void setBackgroundDrawable(Drawable d) { 从这个代码看出,上述例子里the setBackgroundDrawable reset the drawable’s callback after the activity reloaded. when the setBackgroundDrawable() is called, the Drawable has setCallback() invoked, which will overwrite the current callback, therefore no memory leak?Context
?能被在很多方面应用,但是最多的是加载访问资源,这就是为啥widget接受一个a?Context
?参数在构造函数里。Context,activity和application。
private void unbindDrawables(ArrayList<ItemInfo> desktopItems) { if (desktopItems != null) { final int count = desktopItems.size(); for (int i = 0; i < count; i++) { ItemInfo item = desktopItems.get(i); switch (item.itemType) { case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: ((ApplicationInfo)item).icon.setCallback(null); break; } } } }俩中避免与context相关联的内存泄露。The most obvious one is to avoid escaping the context outside of its own scope.上述例子展示了一个静态引用的例子。但是内部类和他们的隐士的外部引用能是同样危险的。这第二个解答是用application context。这个context将活着和你的application一样长,并不依赖这activity的生命周期。如果你计划保持长引用的对象,他需要一个context,记者用application的。通过Context.getApplicationContext()or Activity.getApplication()
…
if (d != null) {
…
d.setCallback(this);
…
}
…
}
详细解决方案
Android 内存储器泄露
热度:59 发布时间:2016-05-01 16:44:55.0
相关解决方案
- android 读取byte[]中的元素解决方案
- android 标题栏兑现方式
- android 中Activity向BroadcastReceiver发送数据,该怎么解决
- Android 4.0 为什么模拟器老是提示小弟我谷歌拼音输入法已停止
- android:getSharedPreferences() 这是哪个类的方法解决思路
- android 怎么判断一个程序是否联网
- android 大量数据按周分组,该如何解决
- android RadioButton如何设置默认选中
- ksoap2-android-这个包,连接webService怎么设置超时
- android 怎么重新设置锚点
- android UI界面设计解决方案
- android 图片对象获取的有关问题
- android 怎么调用淘宝支付宝接口
- Android 沿袭InputMethodService自定义输入法
- android 关于服务连接的疑义
- android 两个activity如何通信
- android 怎么实现对view的放大和缩小
- android 教程解决方法
- android ID,该如何处理
- 准备复习2-3个月,看java+android,请问有经验者,怎么看效果最好》
- android UI线程与AsyncTask的有关问题
- android(java)中的java.net能不能和c#的system.net.sockets进行tcp通信,该如何解决
- android ListView 中的onItemClick Intent 没法跳转
- android(java) 中文乱码的有关问题
- c#c++,android,ios(iphone),php,java视屏课程 散分
- android Post文件到ASP.NET的有关问题,能收到参数收不到文件
- RIM 替 Android 开发者提供免费的 PlayBook!2月13日前
- android 动态设立控件高度
- Android test project 编译方法
- android -相机使用教程(1)解决方法