请指教!关于因为内存不够应用被回收的问题,如何解决或者避免?

oO桀骜 2012-10-09 05:54:44
大家都知道android的内存控制,在内存不够时会回收一些系统判断为无用的东西,我现在遇到一个问题,描述如下:

我做了一个应用A,A应用中使用到了地图服务,我是遍历手机内的地图软件,弹出一个列表供用户选择使用哪个应用查看位置信息。

当我在A应用中使用某个地图应用打开该位置信息后,再从该地图应用返回我的应用时我发现在低内存手机上很容易发生我的应用被回收了,导致我点击应用界面(从地图应用返回后我的应用原本跳到地图应用上的那个界面还在,但是所有的数据都没有了)会报空指针异常(因为都被回收了,在我的应用中所有的对象都置空了所以会报空)。

在高内存手机上我目前没有测试到,所以我得到的结论应该是手机内存太低不够运行地图软件的强制回收了我的应用的内存,导致的这个问题,现在问题来了,请问:

有没有什么比较好的机制来控制不发生这种事情?即使是低内存手机。
如果没有什么方法能控制的话能不能我通过在我的应用中保存什么东西,当发生了回收后我从地图应用中返回可以使用这个保存的对象来重现之前的界面状况?

不知道表述清没有,求解。谢谢!
...全文
225 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
北派_三叔 2012-10-30
  • 打赏
  • 举报
回复
你解决了吗 我也碰到同样的问题,纠结中,但是有一个方法,那就是oncreate重新加载数据,但是application里的东西都没啦,咋办呢
oO桀骜 2012-10-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 5 楼 的回复:

引用 4 楼 的回复:

感觉 onSaveInstanceState 就能完美解决你的问题

http://blog.sina.com.cn/s/blog_572dea1a01010ew4.html

恩,其实我之前在搜索解决办法时也想到了这个,可是有疑惑的是他们的解释都是activity被回收前会保存信息,那么我问个可能很小白的问题,如果说我的整……
[/Quote]

我还有点不理解,这个

@Override
protected void onSaveInstanceState(Bundle outState){
outState.putString("lastPath", "/sdcard/android123/cwj/test");
}


@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);

String cwjString = savedInstanceState.getString("lastPath");
}


在我的实际应用中怎么使用?我在我需要保存这个activity和应用的所有相关信息,请问下,我在onSaveInstanceState内该保存些什么?如何保存?在onRestoreInstanceState又怎么取出来,取出来怎么使用?
sorry,我可能问得有点让人觉得抓狂,可是确实对它的使用不怎么理解啊。。。。因为按照我的理解就算我们不重写这两个方法,android本身就有的机制其实在系统回收时其实应该也已经执行了上面的这两个函数了,但是为什么就再我的应用中又没能在返回时恢复数据呢?我想肯定还是我没能理解透彻,所以请教下你,万谢!
fishmen26 2012-10-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 4 楼 的回复:

感觉 onSaveInstanceState 就能完美解决你的问题

http://blog.sina.com.cn/s/blog_572dea1a01010ew4.html

恩,其实我之前在搜索解决办法时也想到了这个,可是有疑惑的是他们的解释都是activity被回收前会保存信息,那么我问个可能很小白的问题,如果说我的整个应用被系统kill掉了呢?就是……
[/Quote]

有用,因为你要存的数据都持久化了, 当你回来的时候会从本地把数据导回来。跟进程被kill没有关系
oO桀骜 2012-10-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

onSaveInstanceState这个方法不是专门用在被系统回收之前么
[/Quote]
恩,其实我之前在搜索解决办法时也想到了这个,可是有疑惑的是他们的解释都是activity被回收前会保存信息,那么我问个可能很小白的问题,如果说我的整个应用被系统kill掉了呢?就是我的应用的内存堆栈完全被杀掉了,这个方法还好用吗?
oO桀骜 2012-10-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

在A跳到地图应用前,将数据或者参数保留,当重新启用A时去读这个数据或者参数。
[/Quote]
恩,其实我之前在搜索解决办法时也想到了这个,可是有疑惑的是他们的解释都是activity被回收前会保存信息,那么我问个可能很小白的问题,如果说我的整个应用被系统kill掉了呢?就是我的应用的内存堆栈完全被杀掉了,这个方法还好用吗?
oO桀骜 2012-10-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

感觉 onSaveInstanceState 就能完美解决你的问题

http://blog.sina.com.cn/s/blog_572dea1a01010ew4.html
[/Quote]
恩,其实我之前在搜索解决办法时也想到了这个,可是有疑惑的是他们的解释都是activity被回收前会保存信息,那么我问个可能很小白的问题,如果说我的整个应用被系统kill掉了呢?就是我的应用的内存堆栈完全被杀掉了,这个方法还好用吗?
谢谢!
oO桀骜 2012-10-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

你看可以搜搜关于onSaveInstanceState 的例子,API Demo 里面也有例子
[/Quote]
今天试了一天了,发现使用这个onSaveInstanceState 存储在bundle内的数据,简单的类型都可以没有问题,但是一旦想往里面放入对象类的东西,使用putSerializable或者putParcelable放入对象的话又会报强转的错误,目前走到死胡同了。。。而且我发现我的应用在被系统回收后再次回来时整个应用的applicationContext都发生了变化,何解?求指条明路啊~
fishmen26 2012-10-10
  • 打赏
  • 举报
回复
你看可以搜搜关于onSaveInstanceState 的例子,API Demo 里面也有例子
fishmen26 2012-10-09
  • 打赏
  • 举报
回复
感觉 onSaveInstanceState 就能完美解决你的问题

http://blog.sina.com.cn/s/blog_572dea1a01010ew4.html
balmy 2012-10-09
  • 打赏
  • 举报
回复
做好数据的保存是必要,因为你的应用的优先级比较低,当系统内存不足时会优先kill掉你应用的进程,虽然可以通过修改framework的代码调整应用的优先级减少被kill的可能,但是对第三方应用来说有点不太现实,还是多做准备工作吧,很多系统的原生应用也是这样处理,比如邮、信息这些应用
dong3560 2012-10-09
  • 打赏
  • 举报
回复
onSaveInstanceState这个方法不是专门用在被系统回收之前么
AMinfo 2012-10-09
  • 打赏
  • 举报
回复
在A跳到地图应用前,将数据或者参数保留,当重新启用A时去读这个数据或者参数。

80,392

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧