2011-09-01 4 views
1

simplecursor 어댑터를 사용하는 동안 listview에서 이상한 문제가 있습니다. 여기에 내가 활동에서 Filter.filter 메서드 호출에 의해 호출 내 cursorAdapter에서 구현 runQueryOnBackgroundThread 한 오류simplecursor 어댑터가있는 Android 목록보기가 응용 프로그램을 중단합니다 (ANR이 표시되지 않음)

08-31 21:50:14.540: INFO/dalvikvm(12195): Uncaught exception thrown by finalizer (will be discarded): 
08-31 21:50:14.540: INFO/dalvikvm(12195): java.lang.IllegalStateException: Binder has been finalized! 
08-31 21:50:14.540: INFO/dalvikvm(12195):  at android.os.BinderProxy.transact(Native Method) 
08-31 21:50:14.540: INFO/dalvikvm(12195):  at android.database.BulkCursorProxy.close(BulkCursorNative.java:289) 
08-31 21:50:14.540: INFO/dalvikvm(12195):  at android.database.BulkCursorToCursorAdaptor.close(BulkCursorToCursorAdaptor.java:141) 
08-31 21:50:14.540: INFO/dalvikvm(12195):  at android.database.CursorWrapper.close(CursorWrapper.java:43) 
08-31 21:50:14.540: INFO/dalvikvm(12195):  at android.content.ContentResolver$CursorWrapperInner.close(ContentResolver.java:1575) 
08-31 21:50:14.540: INFO/dalvikvm(12195):  at android.content.ContentResolver$CursorWrapperInner.finalize(ContentResolver.java:1586) 
08-31 21:50:14.540: INFO/dalvikvm(12195):  at dalvik.system.NativeStart.run(Native Method) 

입니다. 그래서 나는 내 활동에 커서의 참조가 없다. 내가 쿼리를 매번 여기가

public void changeCursor(Cursor cursor) { 
     Log.d(TAG, "Cursor changed ... **************** "+ cursor); 
     if (cursor != null) { 
      setLoading(false); 
     } 
     super.changeCursor(cursor); 
     initSectionHeaders(cursor); 
     notifyDataSetChanged(); 
    } 

runQueryOnBackgroundThread() 그냥 쿼리에서 커서를 반환 모습입니다 내가 커서 SimpleCursorAdapter

를 확장 내 커서 어댑터에 콜백을 변경할 수 이해합니다.

어디에서나 커서를 닫거나 관리해야합니까? 리드에 도움이된다면 큰 도움이됩니다. 미리 감사드립니다.

** UPDATE * * 이전에 게시 된 데이터를 얻기 위해 바인드 뷰에 커서를 사용할 때 내가 changeCursor 오버라이드 (override) 한이 두 가지 기능 이상

public Cursor runQueryOnBackgroundThread(CharSequence constraint) { 
     Log.d(TAG, "runQueryOnBackgroundThread "+ constraint); 
     if (getFilterQueryProvider() != null) { 
      return getFilterQueryProvider().runQuery(constraint); 
     } 
     return doQuery(constraint, People.CONTENT_URI); 
    } 

private Cursor doQuery(CharSequence constraint, Uri queryUri){ 
     StringBuilder selectionStrBuilder = new StringBuilder(); 
     String selectionArgs[] = null; 
     String selection = null; 

     if(constraint!=null){ 
      //ADDING GLOB so that the sql query can interpret linux style wildcards 
      selectionStrBuilder.append("(UPPER(").append(People.DISPLAY_NAME).append(") GLOB ?)"); 

      selection = selectionStrBuilder.toString(); 
      String constraintStr = constraint.toString().toUpperCase(); 

      //prepend and append '*' - TODO improve 
      constraintStr = "*"+ constraintStr; 
      constraintStr +="*"; 

      selectionArgs = new String[]{constraintStr}; 
     } 
     ContentResolver contentRes = context.getContentResolver(); 
     return contentRes.query(queryUri, null, selection, selectionArgs, People.DISPLAY_NAME); 
    } 

다른 내 어댑터의 조각. 다른 곳에서는 커서 속성을 닫거나 수정하지 않습니다.

내 제공자 getQuery 기능을 보이는 같은

SQLiteDatabase db = dbHelper.getReadableDatabase(); 
     Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy); 

     // Tell the cursor what uri to watch, 
     // so it knows when its source data changes 
     c.setNotificationUri(getContext().getContentResolver(), uri); 
     return c; 

UPDATE2 *

나는이에 무엇을보고 매우 다르다 내가이 스택 트레이스를 얻을 에뮬레이터에서 동일한 프로그램을 실행하면 태블릿.

01-03 17:21:44.130: ERROR/IMemory(9328): binder=0x3891a0 transaction failed fd=-2147483647, size=0, err=-2147483646 (Unknown error: 2147483646) 
01-03 17:21:44.130: ERROR/IMemory(9328): cannot dup fd=-2147483647, size=0, err=-2147483646 (Bad file number) 
01-03 17:21:44.130: ERROR/IMemory(9328): cannot map BpMemoryHeap (binder=0x3891a0), size=0, fd=-1 (Bad file number) 
01-03 17:21:44.130: WARN/dalvikvm(9328): JNI WARNING: JNI method called with exception raised 
01-03 17:21:44.130: WARN/dalvikvm(9328):    in Ldalvik/system/NativeStart;.run()V (CallStaticVoidMethodV) 
01-03 17:21:44.130: WARN/dalvikvm(9328): Pending exception is: 
01-03 17:21:44.130: INFO/dalvikvm(9328): Ljava/lang/RuntimeException;: No memory in memObj 
01-03 17:21:44.130: INFO/dalvikvm(9328):  at android.database.CursorWindow.native_init(Native Method) 
01-03 17:21:44.130: INFO/dalvikvm(9328):  at android.database.CursorWindow.<init>(CursorWindow.java:518) 
01-03 17:21:44.130: INFO/dalvikvm(9328):  at android.database.CursorWindow.<init>(CursorWindow.java:27) 
01-03 17:21:44.130: INFO/dalvikvm(9328):  at android.database.CursorWindow$1.createFromParcel(CursorWindow.java:493) 
01-03 17:21:44.130: INFO/dalvikvm(9328):  at android.database.CursorWindow$1.createFromParcel(CursorWindow.java:491) 
01-03 17:21:44.130: INFO/dalvikvm(9328):  at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:103) 
01-03 17:21:44.130: INFO/dalvikvm(9328):  at android.os.Binder.execTransact(Binder.java:320) 
01-03 17:21:44.130: INFO/dalvikvm(9328):  at dalvik.system.NativeStart.run(Native Method) 
01-03 17:21:44.130: INFO/dalvikvm(9328): "Binder Thread #3" prio=5 tid=9 NATIVE 
01-03 17:21:44.130: INFO/dalvikvm(9328): | group="main" sCount=0 dsCount=0 obj=0x405de828 self=0x8e288 
01-03 17:21:44.130: INFO/dalvikvm(9328): | sysTid=9336 nice=0 sched=0/0 cgrp=[fopen-error:24] handle=959480 
01-03 17:21:44.130: INFO/dalvikvm(9328): at dalvik.system.NativeStart.run(Native Method) 
01-03 17:21:44.130: ERROR/dalvikvm(9328): VM aborting 

그리고 응용 프로그램을 중단합니다.

나는 here

누구나 같은 문제에 직면하게이 문제에 대한 버그 리포트를 발견? 어떤 도움을 주시면 감사하겠습니다. 감사합니다.

+0

알림. 이것은 ANR이 아니지만 응용 프로그램이 손상된 경우 – Photon

+0

어댑터를 게시 할 수 있습니까? – Jack

+0

어댑터 코드 스 니펫으로 ** 업데이트 ** – Photon

답변

1

아아 결국 마약 문제에 대한 해결책을 찾았습니다. 프레임 워크의 다른 부분에있는 일부 커서가 열려 있습니다. 닫을 때 작동합니다.

+0

커서가 프레임 워크에 의해 열리는 것을 의미합니까 아니면 스스로 열 수 있습니까? 동일한 문제가 발생합니다. 커서를 닫으려면 startManagingCursor를 사용했습니다. –

+0

이것은 내가 열어 둔 커서 때문에 닫히지 않았기 때문입니다. – Photon

관련 문제