DB접근하는 클래스가 TimeDB 이렇게 있고
여기에
public synchronized void getData(.....){
SQLiteDatabase db = mDBOpenHelper.getReadableDatabase( );
Cursor c = db.rawQuery(.....);
......
this.funtion_a(db);
......
db.close( );
}
public synchronized ... funtion_a(SQLiteDatabase db){
....
}
이런 식으로 메소드가 있습니다.
이걸 리스트에서 쓰레드로 getData 해서 불러오는데
데이터를 동적으로 불러오는 리스트죠. 링크드리스트 처럼.
리스트를 스크롤 하면 새 항목이 추가될 때 쓰레드에서 데이터를 받아오고 받아왔다고 알려오면 화면에 업데이트 하는 건데요.
리스트가 한꺼번에 여러개 로딩되려고 하면 가끔씩 에러가 납니다..
뭐 에러가 참 다양한데요..
db가 이미 닫혔다. db가 열려있지 않다.
라는 에러가 가장 많이 뜨네요.
synchronized 가 붙은 메소드는 같은 객체일 경우 어떤 쓰레드가 접근하면 다른 쓰레드가 접근할 수 없다고 들었는데요.
혹시 위에 코드에서 getData 내부에서 funtion_a 라는 메소드로 들어가면 대기중인 다른 메소드가 getData 메소드로 들어올 수 있나요?
TimeDB 객체 자체는 전역? 비슷하게 되서 DB결과 자체는 모든 쓰레드가 같은 TimeDB 객체에서 얻어오는 구조입니다만..
그럼 접근을 못 하니까 에러도 없어야 될텐데...
이미 닫혔다, 열려있지 않다, 는 건.. 어떤 쓰레드가 getData 메소드에 중간쯤을 실행중인데 두번째 쓰레드가 이 쓰레드에 접근 성공했다는 거... 맞죠?
그래서...음
쓰레드를 쓰기는 하되
읽어들일 리스트 항목이 여러개라고 해도 순서를 정해서 순서대로 하나씩 읽도록 하는 편이 나으려나요.




언제 어떻게 busy error 가 떨어질지 몰라요