我正在编写一个程序来与Android Contacts数据库同步大量的联系人.下载适用于大约700个联系人,之后我一直得到一个内存堆错误,它调用无限数量的GC语句并最终重新启动电话.我正面临着HTC欲望的问题.
我使用DDMS中的Heap alocation工具检查了应用程序的堆大小,并使用Debug.dumpHprofData提取了hprof文件.两个日志都表明堆大小约为2.4MB.
但是,我得到以下日志,表明堆大小超过32.MB
dalvikvm-heap(92): Clamp target GC heap from 33.999MB to 32.000MB
dalvikvm(92): GC_FOR_MALLOC freed 2 objects / 48 bytes in 313ms
Run Code Online (Sandbox Code Playgroud)
我在循环中插入了以下日志语句,其中写了contatcs下载逻辑.
Log.e("Memory", "free mem =" +runtime.freeMemory());
Log.e("Memory", "total memory =" +runtime.totalMemory());
Run Code Online (Sandbox Code Playgroud)
这些是打印的声明的初始值和最终值
---------------------------------------------------------------
11-11 12:56:04.168: ERROR/Memory(25132): free mem =871248
11-11 12:56:04.168: ERROR/Memory(25132): total memory =4202464
---------------------------------------------------------------
11-11 13:01:55.408: ERROR/Memory(25132): free mem =891640
11-11 13:01:55.408: ERROR/Memory(25132): total memory =4726752
---------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
这表明同步联系人逻辑中没有内存泄漏.
有人可以告诉我为什么堆大小增加(高达32.00Mb)到设备重新启动的程度?我是Android和Java的新手,所以请放轻松我:).....
java android garbage-collection memory-leaks memory-management
是否可以将TableLayout与ArrayAdapter绑定?
我应该使用以下哪两个来确保所有游标都关闭?
Cursor c = getCursor();
if(c!=null && c.getCount()>0){
try{
// read values from cursor
}catch(..){}
finally{
c.close();
}
}//end if
OR
Cursor c = getCursor();
try{
if(c!=null && c.getCount()>0){
// read values from cursor
}//end if
}catch(..){
}finally{
c.close();
}
Run Code Online (Sandbox Code Playgroud)
编辑:
几个问题:
1.我们需要在计数为0的游标上调用close()吗?
因为在第一个习语的情况下,将永远不会调用close().它假定对于没有元素的游标,永远不会打开游标.这是一个有效的假设吗?
请指教.
我是WakeLock概念的新手,需要你的帮助.
问题:
我假设WakeLock是某种类型的锁,当执行代码保持时,它会阻止设备休眠.如果设备已处于睡眠/待机模式,那么代码会执行吗?假设它永远不会获得WakeLock?
当在后台线程(AsyncTask)中完成一个长时间运行的任务(abt 7-8秒)时,我是否应该为持有WakeLock而烦恼?AsyncTask是否已经为我获取了它?
我们赞赏官方文件的链接和唤醒锁上的文章.
谢谢.
我试图了解traceview的工作原理.我试图使用traceview分析一个方法,但有一个查询.
我附上了.trace的快照.它表示大多数时间是用蓝色标记的(顶层).但是没有进一步的信息.(执行此方法或执行的功能时.)

任何人都可以向我解释为什么它消耗这么多时间?
提前致谢!
我有一个包含自定义行的ListView.此自定义行具有以下UI元素
要求是每当列表行被选中时,将会有以下更改
imageView1背景,颜色改变了
imageView1颜色已更改
textview1的颜色,大小和字体是变化的
textview2颜色,大小改变了
textview3颜色,大小改变
为此设计最好的方法是什么?
AFAIK我们无法在选择器中应用样式.有没有更好的方法来处理这个而不是在java代码中处理?
我们有setOnItemSelectedListener,可以在Listview上设置,它将具有以下回调方法:
i)onItemSelected
ii)onNothingSelected
然而,没有回调方法提供失去焦点的项目的细节.这是一个更好的地方吗?
提前致谢.
是否有任何android API来提取vcard 3.0格式的联系人?我遇到了一个开源vcard项目android-vcard
但在使用示例中,提到了以下注释.
重要提示:如果您正在为Android设备开发应用程序,则不必使用此库,因为它已包含在基础Android框架中.只有在开发要在Android环境之外运行的应用程序时,此库才有用.Android开发人员:两次阅读此文本.
您能告诉我上面描述中提到哪个库吗?它是否可供应用程序开发人员使用?