私は、ここにいくつかのデータベースオブジェクトがリリースされたことを私に見せてくれる不思議な問題があります。データベースオブジェクトが最初に閉じられることなくGCによって解放されました
コンソール出力:
SOMETIMES I DROP GC stuff
WITH FILENAME stuff
WITH FILENAME stuff
WITH FILENAME stuff
**** WARNING! Database object was released by the GC without being closed first! This might cause crashes on iOS *****
**** WARNING! Database object was released by the GC without being closed first! This might cause crashes on iOS *****
**** WARNING! Database object was released by the GC without being closed first! This might cause crashes on iOS *****
WITH FILENAME stuff
WITH FILENAME stuff
WITH FILENAME stuff
AND GC stuff is somewhere here
および対応する方法
@Override
protected boolean initListModelPhotoList(List cmp) {
Integer imgHeight = Display.getInstance().getDisplayHeight()/10;
Image placeholderImg = fetchResourceFile().getImage("camera_placeholder.png");
System.err.println("SOMETIMES I DROP GC stuff");
Storage storage = Storage.getInstance();
Vector vector = new Vector();
for (xyz.model.Image image : images) {
if (!image.getDeleted()) {
Hashtable tableItem = new Hashtable();
Image img = null;
try {
if (!storage.exists(image.getFileName())) {
img = placeholderImg;
tableItem.put("icon", img.scaled(imgHeight, -1));
} else {
InputStream is = storage.createInputStream(image.getFileName());
img = Image.createImage(is);
// tableItem.put("icon", img.scaled(imgHeight, -1));
is.close();
System.err.println("WITH FILENAME stuff");
}
tableItem.put("emblem", image.getFileName());
tableItem.put("sort", image.getSort());
} catch (IOException e) {
e.printStackTrace();
}
vector.add(tableItem);
}
}
System.err.println("AND GC stuff is somewhere here");
cmp.setModel(new com.codename1.ui.list.DefaultListModel(vector));
return true;
}
私も問題が何であるかをチェックするためのInputStreamに近い()とUtil.cleanup(ある)を実行しようとしましたここに。通常は、このメソッドの各呼び出しでStorage.getInstance()を実装しました。
私はこれを無視することができる場合があるメソッドの誤用があるかどうかは、他の部分にInputstream is
後の行をコメントアウトすると、私はコンソール
で、このようなメッセージが表示されますいけないので、ここで尋ねる質問イムがあります?
コードを最適化して修正するためにDAOメソッドを少し前にリファクタリングしましたが、メッセージの後に正しく閉じられなかったメソッドを見つけることができました。今少し深く掘り起こすと、もう少しコードを改善できて、今はなくなったと思います。 EDIT:DAOを呼び出したメソッドにエラーがあり、そこから返されたオブジェクトをループして、別のDAOを開いて子オブジェクトを呼び出しました。それは私が監督して閉じてしまうのを忘れた理由です(y)。エラーは 'initList'呼び出しの前に呼び出されたメソッドにもありました – kaya