2011-10-11 3 views
0

결선 :내 주요 활동에 포착되지 않은 오류

button = (Button) findViewById(R.id.mainAddWatchButton); 
button.setOnClickListener(new Button.OnClickListener() { 
    public void onClick(View v) { 
    startActivity(new Intent(audiovideo, CountyBrowser.class)); 
    } 
}); 

CountyBrowser 활동 (그냥 예상대로, 미세 동작) 좋은 시작을하지만, 이와 같은 일들이 로그 캣에서 결선 :

10-11 19:10:41.182: INFO/ActivityManager(58): Starting activity: Intent { cmp=se.ribit.bb/.CountyBrowser } 
10-11 19:10:41.782: DEBUG/dalvikvm(368): GC freed 6313 objects/354184 bytes in 114ms 
10-11 19:10:41.812: INFO/dalvikvm(368): Uncaught exception thrown by finalizer (will be discarded): 
10-11 19:10:41.812: INFO/dalvikvm(368): Ljava/lang/IllegalStateException;: Finalizing cursor [email protected] on null that has not been deactivated or closed 
10-11 19:10:41.823: INFO/dalvikvm(368):  at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596) 
10-11 19:10:41.823: INFO/dalvikvm(368):  at dalvik.system.NativeStart.run(Native Method) 
10-11 19:10:41.852: INFO/dalvikvm(368): Uncaught exception thrown by finalizer (will be discarded): 
10-11 19:10:41.862: INFO/dalvikvm(368): Ljava/lang/IllegalStateException;: **Finalizing cursor [email protected] on null that has not been deactivated or closed** 
10-11 19:10:41.862: INFO/dalvikvm(368):  at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596) 
10-11 19:10:41.873: INFO/dalvikvm(368):  at dalvik.system.NativeStart.run(Native Method) 
10-11 19:10:42.452: INFO/ActivityManager(58): Displayed activity se.ribit.bb/.CountyBrowser: 1198 ms (total 1198 ms) 
10-11 19:10:47.702: DEBUG/dalvikvm(206): GC freed 124 objects/5424 bytes in 154ms 
10-11 19:10:52.692: DEBUG/dalvikvm(105): GC freed 2292 objects/133288 bytes in 107ms 

데이터베이스와 커서를 사용하고 있지만 위의 메시지는 내가 잘못했는지 여부에 상관없이 0 정보를 포함합니다. 이 로그를 제외하고 활동은 잘 작동합니다. 모든 것을 디버그 모드로 실행하면, 에뮬레이터는 항상 이클립스로 되돌아 간다.

여기에 뭔가가 있습니까? 누구든지 내가 뭘 잘못하고 있는지 추측 해봐?

답변

1

활동이 일시 중지되기 전에 커서를 닫아야한다고 생각합니다. 새 Activity를 여는 Activity의 onPause 메소드에서 커서를 닫으십시오.

void onPause(){ 
    myCursor1.close(); 
    myCursor2.close(); 
} 
+0

안녕하세요. 미안하지만, 조금 불분명하지만 startManagingCursor()를 사용하고 있으므로 걱정할 필요가 없습니다. 스텝 디버깅을 많이 마친 후 마침내 오류의 출처를 찾았습니다 (다음 게시물 참조). – bos

0

많은 스텝 - 디버깅 후, 나는 오류의 원인을 발견했다. 너무 순진하게도 내가 커서가 자체적으로 할 때이 방법을 반환 죽을 줄 알았는데,하지만 난 분명히이 사실에 매우 잘못,

private boolean doesColumnExist(String table, int id) { 
    SQLiteDatabase db = this.dbHelper.getReadableDatabase(); 
    String query = String.format("SELECT count(*) FROM %s WHERE %s = %s", 
           table, C_ID, id); 
    Cursor c = db.rawQuery(query, null); 
    c.moveToFirst(); 
    return (c.getInt(0) == 1); 
} 

나는 아직 자바에서 좋은 아니에요 :이 방법을했다. 이 방법을 다음과 같이 다시 작성해야했습니다.

private boolean doesColumnExist(String table, int id) { 
    SQLiteDatabase db = this.dbHelper.getReadableDatabase(); 
    String query = String.format("SELECT count(*) FROM %s WHERE %s = %s", 
           table, C_ID, id); 
    Cursor c = db.rawQuery(query, null); 
    c.moveToFirst(); 
    boolean retVal = (c.getInt(0) == 1); 
    c.close(); 

    return retVal; 
} 

이제 모든 LogCat 채우기가 사라졌습니다.

수동으로 c.close()를 수행해야한다는 것을 결코 깨닫지 못했습니다. Java를 처음 접했을 때 Java의 GC가이를 처리 할 것으로 생각했습니다. 자바 책에서 더 이상 읽으면 나는 틀린, 아주 틀린 것을 증명했다.

관련 문제