2011-05-26 4 views
9

Gizlice girmiş olabilecek gizli bir soruyu kontrol etmek için StrictMode'da uygulamamı çalıştırmaya çalışıyorum. Karşılaştığım bir sorun, ContentResolver kullanırken Leaked DatabaseConections uygulamasının yanlış bir pozitifliği gibi görünüyor. Bu bir şey olduğunu varsayıyorumAndroid StrictMode yanlış pozitif bildiriyor

ERROR/StrictMode(26219): Releasing cursor in a finalizer. Please ensure that you explicitly call close() on your cursor: 

ERROR/StrictMode(26219): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 

ERROR/StrictMode(26219): 
     at android.database.CursorWindow.<init>(CursorWindow.java:62) 
     at android.content.ContentProviderProxy.query(ContentProviderNative.java:403) 
     at android.content.ContentResolver.query(ContentResolver.java:302) 

:

Cursor c = context.getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, cols, null, null, MediaStore.Video.Media.DEFAULT_SORT_ORDER); 

c.close() 

2 satır yukarıda aşağıdaki StrictMode ihlali oluşturabilir: Bazı deneylerde sonra

Aşağıdaki kod 2 satır basitleştirilmiş sorunu var İmleç bir contentProvider tarafından döndürüldüğü gerçeğine özgü (bu yüzden doğrudan bir SQLite imleci değildir).

Bu gerçekten yanlış bir pozitif mi yoksa gerçekten sızdıran bir imleç varsa herhangi bir fikir sahibi olur mu.

+2

Honeycomb ile yayınlanan CursorLoader API'sini kullanarak benzer bir şey görüyorum. Bir CursorLoader (bir arka plan iş parçacığında sorguyu gerçekleştirir) ve bir SimpleCursorAdapter var. Prensip olarak, SimpleCursorAdapter, CursorLoader'dan yeni bir tane takas ettiğimde mevcut tüm imleci kapatmalıdır. Ancak, bu imleç sonlandırıcı StrictMode ihlallerini de görmeye devam ediyorum, bu yüzden biraz şaşırtmaca. – tomtheguvnor

cevap

1

Sanırım sorunun nerede olduğunu açıklayabilirim. Veritabanını sorguladığınızda bir istisna alabilirsiniz. Böylece, bir İmleç oluşturulacak c.close() çağrılmayacaktır çünkü bir istisna vardır. Böylece, imlecin yaratılışını try catch bloğuna koymanız ve son bloğundaki cursonu kapatmanız gerekir.