【发布时间】:2011-10-23 19:42:01
【问题描述】:
我的应用每隔 x 时间检查一次未接电话。一切正常,但一段时间后它会导致 Google 服务框架 (com.google.process.gapps) 崩溃并显示强制关闭对话框。所以我把手机插上电源,看了看 LogCat,在检查未接来电时发现了这个错误。
E/IMemory(11481): 无法复制 fd=1023, size=1048576, err=0 (太多 打开文件)
E/IMemory(11481):无法映射 BpMemoryHeap (binder=0x8b06f0), size=1048576, fd=-1(错误文件号)
E/JavaBinder(11481): * 未捕获的远程异常! (例外情况是 尚不支持跨进程。)
E/JavaBinder(11481): java.lang.RuntimeException: memObj 中没有内存
E/JavaBinder(11481):在 android.database.CursorWindow.native_init(Native Method)
E/JavaBinder(11481):在 android.database.CursorWindow.(CursorWindow.java:518)
E/JavaBinder(11481):在 android.database.CursorWindow.(CursorWindow.java:27)
E/JavaBinder(11481):在 android.database.CursorWindow$1.createFromParcel(CursorWindow.java:493)
E/JavaBinder(11481):在 android.database.CursorWindow$1.createFromParcel(CursorWindow.java:496)
E/JavaBinder(11481):在 android.content.ContentProviderNative.onTransact(ContentProviderNative.java:103)
E/JavaBinder(11481):在 android.os.Binder.execTransact(Binder.java:288)
E/JavaBinder(11481): at dalvik.system.NativeStart.run(Native Method)
这是我检查未接电话的方式
String[] projection = { CallLog.Calls.TYPE, CallLog.Calls.NEW };
String where = CallLog.Calls.TYPE + "=" + CallLog.Calls.MISSED_TYPE + " AND " + CallLog.Calls.NEW + "=1";
Cursor c = this.getContentResolver().query(CallLog.Calls.CONTENT_URI, projection, where, null, null);
if(c != null) {
c.moveToFirst();
int mMissedCallCount = c.getCount();
...
}
所以查看 LogCat 是导致问题的光标。我在这里做错了吗?还有“打开的文件太多”是什么意思?我还没有打开任何文件——反正我都知道......
【问题讨论】: